From 8f387b492ba5729cf985035bf627315620440755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=B9=8F?= Date: Wed, 16 Sep 2026 16:53:39 +0800 Subject: [PATCH] Add technology stack management --- .../app/AppTechStackController.java | 78 +++++++++ .../com/ruoyi/app/domain/AppTechStack.java | 26 +++ .../ruoyi/app/mapper/AppTechStackMapper.java | 22 +++ .../app/service/IAppTechStackService.java | 19 +++ .../service/impl/AppTechStackServiceImpl.java | 85 ++++++++++ .../mapper/app/AppTechStackMapper.xml | 68 ++++++++ ruoyi-ui/src/api/app/techStack.js | 21 +++ ruoyi-ui/src/views/app/techStack/index.vue | 155 ++++++++++++++++++ 8 files changed, 474 insertions(+) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/app/AppTechStackController.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/app/domain/AppTechStack.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/app/mapper/AppTechStackMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/app/service/IAppTechStackService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/app/service/impl/AppTechStackServiceImpl.java create mode 100644 ruoyi-system/src/main/resources/mapper/app/AppTechStackMapper.xml create mode 100644 ruoyi-ui/src/api/app/techStack.js create mode 100644 ruoyi-ui/src/views/app/techStack/index.vue diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/app/AppTechStackController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/app/AppTechStackController.java new file mode 100644 index 0000000..4c3f105 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/app/AppTechStackController.java @@ -0,0 +1,78 @@ +package com.ruoyi.web.controller.app; + +import java.util.List; +import com.ruoyi.app.domain.AppTechStack; +import com.ruoyi.app.service.IAppTechStackService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/app/techStack") +public class AppTechStackController extends BaseController +{ + @Autowired + private IAppTechStackService techStackService; + + /** 小程序可选择的启用技术栈。 */ + @GetMapping("/options") + public AjaxResult options() + { + return success(techStackService.selectEnabledAppTechStackList()); + } + + @PreAuthorize("@ss.hasPermi('app:techStack:list')") + @GetMapping("/list") + public TableDataInfo list(AppTechStack techStack) + { + startPage(); + List list = techStackService.selectAppTechStackList(techStack); + return getDataTable(list); + } + + @PreAuthorize("@ss.hasPermi('app:techStack:query')") + @GetMapping("/{id}") + public AjaxResult detail(@PathVariable Long id) + { + return success(techStackService.selectAppTechStackById(id)); + } + + @PreAuthorize("@ss.hasPermi('app:techStack:add')") + @Log(title = "定制技术栈", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody AppTechStack techStack) + { + techStack.setCreateBy(getUsername()); + techStack.setUpdateBy(getUsername()); + return toAjax(techStackService.insertAppTechStack(techStack)); + } + + @PreAuthorize("@ss.hasPermi('app:techStack:edit')") + @Log(title = "定制技术栈", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody AppTechStack techStack) + { + techStack.setUpdateBy(getUsername()); + return toAjax(techStackService.updateAppTechStack(techStack)); + } + + @PreAuthorize("@ss.hasPermi('app:techStack:remove')") + @Log(title = "定制技术栈", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(techStackService.deleteAppTechStackByIds(ids)); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/app/domain/AppTechStack.java b/ruoyi-system/src/main/java/com/ruoyi/app/domain/AppTechStack.java new file mode 100644 index 0000000..ee69bd6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/app/domain/AppTechStack.java @@ -0,0 +1,26 @@ +package com.ruoyi.app.domain; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 项目定制技术栈对象 app_tech_stack。 + */ +public class AppTechStack extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + private Long id; + private String name; + private Integer sort; + /** 0启用 1停用 */ + private String status; + + 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 Integer getSort() { return sort; } + public void setSort(Integer sort) { this.sort = sort; } + public String getStatus() { return status; } + public void setStatus(String status) { this.status = status; } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/app/mapper/AppTechStackMapper.java b/ruoyi-system/src/main/java/com/ruoyi/app/mapper/AppTechStackMapper.java new file mode 100644 index 0000000..28c4077 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/app/mapper/AppTechStackMapper.java @@ -0,0 +1,22 @@ +package com.ruoyi.app.mapper; + +import java.util.List; +import com.ruoyi.app.domain.AppTechStack; +import org.apache.ibatis.annotations.Param; + +public interface AppTechStackMapper +{ + AppTechStack selectAppTechStackById(Long id); + + AppTechStack selectAppTechStackByName(@Param("name") String name, @Param("excludeId") Long excludeId); + + List selectAppTechStackList(AppTechStack techStack); + + List selectEnabledAppTechStackList(); + + int insertAppTechStack(AppTechStack techStack); + + int updateAppTechStack(AppTechStack techStack); + + int deleteAppTechStackByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/app/service/IAppTechStackService.java b/ruoyi-system/src/main/java/com/ruoyi/app/service/IAppTechStackService.java new file mode 100644 index 0000000..a171bd8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/app/service/IAppTechStackService.java @@ -0,0 +1,19 @@ +package com.ruoyi.app.service; + +import java.util.List; +import com.ruoyi.app.domain.AppTechStack; + +public interface IAppTechStackService +{ + AppTechStack selectAppTechStackById(Long id); + + List selectAppTechStackList(AppTechStack techStack); + + List selectEnabledAppTechStackList(); + + int insertAppTechStack(AppTechStack techStack); + + int updateAppTechStack(AppTechStack techStack); + + int deleteAppTechStackByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/app/service/impl/AppTechStackServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/app/service/impl/AppTechStackServiceImpl.java new file mode 100644 index 0000000..3eafa34 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/app/service/impl/AppTechStackServiceImpl.java @@ -0,0 +1,85 @@ +package com.ruoyi.app.service.impl; + +import java.util.List; +import com.ruoyi.app.domain.AppTechStack; +import com.ruoyi.app.mapper.AppTechStackMapper; +import com.ruoyi.app.service.IAppTechStackService; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class AppTechStackServiceImpl implements IAppTechStackService +{ + @Autowired + private AppTechStackMapper techStackMapper; + + @Override + public AppTechStack selectAppTechStackById(Long id) + { + return techStackMapper.selectAppTechStackById(id); + } + + @Override + public List selectAppTechStackList(AppTechStack techStack) + { + return techStackMapper.selectAppTechStackList(techStack); + } + + @Override + public List selectEnabledAppTechStackList() + { + return techStackMapper.selectEnabledAppTechStackList(); + } + + @Override + public int insertAppTechStack(AppTechStack techStack) + { + normalizeAndValidate(techStack); + techStack.setCreateTime(DateUtils.getNowDate()); + techStack.setUpdateTime(DateUtils.getNowDate()); + return techStackMapper.insertAppTechStack(techStack); + } + + @Override + public int updateAppTechStack(AppTechStack techStack) + { + if (techStack.getId() == null) + { + throw new ServiceException("技术栈不存在"); + } + normalizeAndValidate(techStack); + techStack.setUpdateTime(DateUtils.getNowDate()); + return techStackMapper.updateAppTechStack(techStack); + } + + @Override + public int deleteAppTechStackByIds(Long[] ids) + { + return techStackMapper.deleteAppTechStackByIds(ids); + } + + private void normalizeAndValidate(AppTechStack techStack) + { + String name = StringUtils.trim(techStack.getName()); + if (StringUtils.isEmpty(name) || name.length() > 50) + { + throw new ServiceException("技术栈名称需填写1至50个字"); + } + if (techStackMapper.selectAppTechStackByName(name, techStack.getId()) != null) + { + throw new ServiceException("技术栈名称已存在"); + } + techStack.setName(name); + if (techStack.getSort() == null || techStack.getSort() < 0) + { + techStack.setSort(0); + } + if (!"1".equals(techStack.getStatus())) + { + techStack.setStatus("0"); + } + } +} diff --git a/ruoyi-system/src/main/resources/mapper/app/AppTechStackMapper.xml b/ruoyi-system/src/main/resources/mapper/app/AppTechStackMapper.xml new file mode 100644 index 0000000..b564a01 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/app/AppTechStackMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + select id, name, sort, status, remark, create_by, create_time, update_by, update_time + from app_tech_stack + + + + + + + + + + + + insert into app_tech_stack (name, sort, status, remark, create_by, create_time, update_by, update_time) + values (#{name}, #{sort}, #{status}, #{remark}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}) + + + + update app_tech_stack + + name = #{name}, sort = #{sort}, status = #{status}, + remark = #{remark}, update_by = #{updateBy}, update_time = #{updateTime} + + where id = #{id} + + + + delete from app_tech_stack where id in + #{id} + + diff --git a/ruoyi-ui/src/api/app/techStack.js b/ruoyi-ui/src/api/app/techStack.js new file mode 100644 index 0000000..a36df72 --- /dev/null +++ b/ruoyi-ui/src/api/app/techStack.js @@ -0,0 +1,21 @@ +import request from '@/utils/request' + +export function listTechStack(query) { + return request({ url: '/app/techStack/list', method: 'get', params: query }) +} + +export function getTechStack(id) { + return request({ url: '/app/techStack/' + id, method: 'get' }) +} + +export function addTechStack(data) { + return request({ url: '/app/techStack', method: 'post', data }) +} + +export function updateTechStack(data) { + return request({ url: '/app/techStack', method: 'put', data }) +} + +export function delTechStack(ids) { + return request({ url: '/app/techStack/' + ids, method: 'delete' }) +} diff --git a/ruoyi-ui/src/views/app/techStack/index.vue b/ruoyi-ui/src/views/app/techStack/index.vue new file mode 100644 index 0000000..17b6f7c --- /dev/null +++ b/ruoyi-ui/src/views/app/techStack/index.vue @@ -0,0 +1,155 @@ + + +