甘肃非物质文化网站系统是一个典型的Java Web应用,采用前后端分离架构实现。这个项目将现代Web开发技术与传统文化保护需求相结合,具有以下典型特征:
前端采用Vue3组合式API开发,后端基于SpringBoot2框架,数据持久层使用MyBatis-Plus简化CRUD操作,数据库选用MySQL8.0的最新特性。整套技术栈的选择体现了当前企业级开发的常见配置方案。
技术选型背后的考量:Vue3的Composition API更适合复杂前端状态管理,SpringBoot2在微服务生态中的成熟度,MyBatis-Plus对单表操作的极致简化,以及MySQL8.0对JSON支持和窗口函数等新特性。
项目采用典型的前后端分离架构:
这种架构的优势在于:
MySQL8.0的表设计特别注意了:
典型表结构示例:
sql复制CREATE TABLE `heritage` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`category_id` int DEFAULT NULL,
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`cover_image` varchar(255) DEFAULT NULL,
`detail_images` json DEFAULT NULL,
`status` tinyint DEFAULT '1',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
后端Controller典型实现:
java复制@RestController
@RequestMapping("/api/heritage")
public class HeritageController {
@Autowired
private HeritageService heritageService;
@GetMapping("/{id}")
public Result<HeritageVO> getDetail(@PathVariable Long id) {
return Result.success(heritageService.getDetail(id));
}
@PostMapping
public Result<Long> create(@Valid @RequestBody HeritageDTO dto) {
return Result.success(heritageService.create(dto));
}
}
Service层使用MyBatis-Plus的Lambda查询:
java复制public PageResult<HeritageVO> query(HeritageQuery query) {
LambdaQueryWrapper<Heritage> wrapper = new LambdaQueryWrapper<>();
wrapper.like(StringUtils.isNotBlank(query.getKeyword()),
Heritage::getName, query.getKeyword())
.eq(query.getCategoryId() != null,
Heritage::getCategoryId, query.getCategoryId())
.orderByDesc(Heritage::getCreateTime);
Page<Heritage> page = page(new Page<>(query.getPage(), query.getSize()), wrapper);
return PageResult.of(page, this::convertToVO);
}
采用阿里云OSS存储非遗项目图片:
关键配置:
yaml复制aliyun:
oss:
endpoint: oss-cn-beijing.aliyuncs.com
bucket: gansu-heritage
access-key-id: ${ACCESS_KEY_ID}
access-key-secret: ${ACCESS_KEY_SECRET}
非遗列表页示例:
vue复制<script setup>
import { ref, onMounted } from 'vue'
import { getHeritageList } from '@/api/heritage'
const list = ref([])
const loading = ref(false)
const pagination = reactive({
page: 1,
size: 10,
total: 0
})
const fetchData = async () => {
loading.value = true
try {
const res = await getHeritageList({
page: pagination.page,
size: pagination.size
})
list.value = res.data.list
pagination.total = res.data.total
} finally {
loading.value = false
}
}
onMounted(fetchData)
</script>
基于Vue Router的权限控制方案:
javascript复制// 路由配置
const routes = [
{
path: '/',
component: Layout,
children: [
{
path: 'heritage',
name: 'Heritage',
component: () => import('@/views/heritage/index.vue'),
meta: { requiresAuth: true, roles: ['admin', 'editor'] }
}
]
}
]
// 路由守卫
router.beforeEach((to, from, next) => {
const hasToken = getToken()
if (to.meta.requiresAuth && !hasToken) {
next('/login')
} else {
next()
}
})
SpringBoot的多环境配置:
yaml复制# application-dev.yml
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/heritage_dev
username: devuser
password: devpass
# application-prod.yml
server:
port: 80
spring:
datasource:
url: jdbc:mysql://prod-db:3306/heritage_prod
username: ${DB_USER}
password: ${DB_PASS}
后端Dockerfile示例:
dockerfile复制FROM openjdk:11-jre
WORKDIR /app
COPY target/heritage-system.jar .
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "heritage-system.jar"]
前端Dockerfile示例:
dockerfile复制FROM nginx:alpine
COPY dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
开发环境配置:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.maxAge(3600);
}
}
生产环境建议:
自定义分页插件:
java复制@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL){
@Override
protected void optimizeCount(IPage<?> page, JdbcTemplate jdbcTemplate, String countSql) {
// 优化count查询
}
});
return interceptor;
}
}
javascript复制const HeritageDetail = defineAsyncComponent(() =>
import('./HeritageDetail.vue')
)
vue复制<router-view v-slot="{ Component }">
<keep-alive>
<component :is="Component" v-if="$route.meta.keepAlive" />
</keep-alive>
<component :is="Component" v-if="!$route.meta.keepAlive" />
</router-view>
vue复制<img v-lazy="item.coverImage" alt="非遗项目封面">
使用Swagger生成API文档:
java复制@Configuration
@EnableOpenApi
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.gansu.heritage"))
.paths(PathSelectors.any())
.build();
}
}
建议包含:
使用工具:
集成高德地图API:
开发建议:
使用ECharts实现:
MySQL时区配置:
sql复制SET GLOBAL time_zone = '+8:00';
SpringBoot配置:
yaml复制spring:
jackson:
time-zone: GMT+8
前端分片上传实现:
javascript复制const chunkSize = 5 * 1024 * 1024 // 5MB
const chunks = Math.ceil(file.size / chunkSize)
for (let i = 0; i < chunks; i++) {
const chunk = file.slice(i * chunkSize, (i + 1) * chunkSize)
await uploadChunk(chunk, i, file.name)
}
乐观锁实现:
java复制@Version
private Integer version;
public void updateHeritage(HeritageDTO dto) {
Heritage heritage = getById(dto.getId());
if (dto.getVersion() != heritage.getVersion()) {
throw new BusinessException("数据已被修改,请刷新后重试");
}
// 更新操作
}
在实际开发这类文化类信息系统时,特别需要注意数据的历史性和准确性。建议建立完善的数据审核流程,对非遗项目的描述、图片等核心信息进行多重校验。同时要考虑基层工作人员的使用习惯,后台管理系统应当操作简便,避免过于复杂的技术概念