Compare commits

..

No commits in common. "4294d135b516886c98e75bffa57010801e7bda62" and "8b3fc5c91aafef9674638eab6e1c3aa6537182ca" have entirely different histories.

6 changed files with 81 additions and 90 deletions

View File

@ -6,7 +6,7 @@ VITE_LOGIN_TITLE = '今日固始电子版 管理平台'
VITE_LOGIN_EN_TITLE = 'GuShi Platform'
VITE_WEB_BASE_API = '/api'
# 本地Mock地址
VITE_SERVER = 'http://democs.gushitv.com/'
VITE_SERVER = 'https://jinrigushi.gushitv.com/'
# 路由模式[哈希模式 AND WEB模式 [hash | history, 这两个模式是固定死的,不能乱改值]
VITE_ROUTER_MODE = hash
# 是否使用全部去除console和debugger

View File

@ -6,7 +6,7 @@ VITE_LOGIN_TITLE = '今日固始电子版 管理平台'
VITE_LOGIN_EN_TITLE = 'GuShi Platform'
VITE_WEB_BASE_API = ''
# 后端接口地址
VITE_SERVER = 'http://democs.gushitv.com/'
VITE_SERVER = 'https://jinrigushi.gushitv.com/'
# 路由模式[哈希模式 AND WEB模式 [hash | history, 这两个模式是固定死的,不能乱改值]
VITE_ROUTER_MODE = hash
# 是否使用全部去除console和debugger

View File

@ -1,8 +1,39 @@
<p align="center">
<img src="https://pic4.zhimg.com/v2-702a23ebb518199355099df77a3cfe07_b.webp" width="200" height="200" />
</p>
<h1 align="center">KOI-UI🌻</h1>
<p align="center">一款<b>开箱即用</b>的 Vue3 中后台管理系统框架[纯前端]</p>
<p align="center">
<span>&nbsp;[&nbsp;</span>
纯前端演示[开源]
<a href="http://39.107.143.109/login" target="_blank">点击这里</a>
<span>&nbsp;]&nbsp;</span>
<p>
<p align="center">
<span>&nbsp;[&nbsp;</span>
前后端演示[129元]
<a href="http://39.107.143.109/login" target="_blank">点击这里</a>
<span>&nbsp;]&nbsp;</span>
<p>
<p align="center">
<span>&nbsp;[&nbsp;</span>
博客演示[269元]
<a href="http://39.107.143.109:8188/home/index" target="_blank">点击这里</a>
<span>&nbsp;]&nbsp;</span>
<p>
前后端版本模版[129元]SpringBoot3、JDK17、Sa-Token等技术
博客版本[269元]:博客 + 管理平台;
## 1、简介
KOI-UI🌻 是一款开源企业级别的中后台管理平台模板,基于 Vue3、Vite、TypeScript、Pinia、Pinia持久化插件、Unocss 和 ElementPlus等前端最新技术栈。相较于其他比较流行的后台管理模板更加简洁、快捷和容易理解对萌新小白十分友好。此项目学习成本非常低含有相关代码注释以及大量的案例非常适合企业级项目、中小型项目、个人项目以及毕业设计。后续将用户、角色、菜单、字典管理和通用管理平台页面依次编写做到直接对接后端接口即可使之快速开发。常见的组件有小伙伴提供可提issus会依次封装进去展示。
## 2、特点
- 🎯 使用 Element Plus + Vite + Vue3 + TypeScript + Uncoss + Pinia 等主流技术。
@ -86,10 +117,6 @@
<td><img src="https://gitee.com/BigCatHome/koi-photo/raw/master/photos/KOI-ADMIN/KOI5.png" /></td>
<td><img src="https://gitee.com/BigCatHome/koi-photo/raw/master/photos/KOI-ADMIN/KOI6.png" /></td>
</tr>
<tr>
<td><img src="https://gitee.com/BigCatHome/koi-photo/raw/master/photos/KOI-ADMIN/KOI7.png" /></td>
<td><img src="https://gitee.com/BigCatHome/koi-photo/raw/master/photos/KOI-ADMIN/KOI8.png" /></td>
</tr>
</table>
## 5、支持
@ -130,14 +157,3 @@ pnpm build:prod
<a href="https://github.com/yuxintao6/koi-ui.git" target="_blank">点击这里</a>
<span>&nbsp;]&nbsp;</span>
<p>
## 9、入群交流
> 注意加微信方式时记得添加备注KOI-UI支持知识付费。
<table>
<tr>
<td><img src="https://gitee.com/BigCatHome/koi-photo/raw/master/photos/KOI-ADMIN/WeChat.png"/></td>
<td><img src="https://gitee.com/BigCatHome/koi-photo/raw/master/photos/KOI-ADMIN/WeChatPay.png"/></td>
</tr>
</table>

View File

@ -4,14 +4,13 @@
<el-row :gutter="20">
<el-col :span="8">
<div style="padding: 0px 20px 20px 0px;font-weight: 600">请在图片边框内选定区域</div>
<el-card :body-style="{ padding: '0' }" style="padding: 0;position:relative;">
<div @mousedown="startDrag" @mousemove="onDrag" @mouseup="endDrag" @mouseleave="endDrag"
style="width: 100%">
<el-card :body-style="{padding:'0'}" style="padding: 0;position:relative;">
<div @mousedown="startDrag" @mousemove="onDrag" @mouseup="endDrag" @mouseleave="endDrag" style="width: 100%">
<!-- 图片 -->
<img draggable="false" id="image-selector" :src="bmInfoData.bm_img" ref="image" alt="image"
@click="handleClick"
style="cursor: crosshair; position: relative; user-select: none; width: 100%; height: auto;"
@load="onImageLoad" />
@load="onImageLoad"/>
<!-- 画布用于绘制矩形路径 -->
<canvas id="myCanvas" ref="canvas" :width="imageWidth" :height="imageHeight"
style="position: absolute; top: 0; left: 0; pointer-events: none;">
@ -21,27 +20,24 @@
</el-col>
<el-col :span="16">
<el-form :model="form" label-width="auto">
<el-form-item label="新闻标题" required>
<el-input v-model="form.new_name" placeholder="请输入新闻标题" size="large" />
<el-form-item label="新闻标题">
<el-input v-model="form.new_name" size="large"/>
</el-form-item>
<el-form-item label="新闻副标题">
<el-input v-model="form.subtitle" placeholder="请输入新闻副标题" size="large" />
<el-input v-model="form.subtitle" size="large"/>
</el-form-item>
<el-form-item label="新闻记者" required>
<el-input v-model="form.reporter" placeholder="请输入新闻记者" size="large" />
<el-form-item label="新闻记者">
<el-input v-model="form.reporter" size="large"/>
</el-form-item>
<el-form-item label="新闻坐标" required>
<el-input disabled v-model="coordinate" placeholder="请选择新闻坐标" size="large" />
<el-button type="danger" class="mt-2" @click="allowClickTrue()">重新选择</el-button>
<el-form-item label="新闻坐标">
<el-input disabled v-model="coordinate" size="large"/>
<el-button class="mt-2" @click="allowClickTrue()">重新选择</el-button>
</el-form-item>
<el-form-item label="新闻视频">
<el-input v-model="form.video" placeholder="请输入新闻视频" size="large"/>
</el-form-item>
<el-form-item label="新闻详情" required>
<el-form-item label="新闻详情">
<el-card shadow="hover">
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" />
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig"/>
<Editor style="height: 300px; overflow-y: hidden;" v-model="form.content" :defaultConfig="editorConfig"
@onCreated="handleCreated" />
@onCreated="handleCreated"/>
</el-card>
</el-form-item>
<el-form-item label=" ">
@ -57,12 +53,12 @@
<script setup lang="ts">
import '@wangeditor/editor/dist/css/style.css' // css
import { getAssets } from "@/utils/index.ts";
import { onBeforeUnmount, ref, shallowRef, onMounted, reactive, nextTick } from 'vue'
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import { bmInfo, newsAdd } from "@/api/system/post";
import { koiNoticeError, koiNoticeSuccess } from "@/utils/koi.ts";
import { useRoute, useRouter } from 'vue-router';
import {getAssets} from "@/utils/index.ts";
import {onBeforeUnmount, ref, shallowRef, onMounted, reactive, nextTick} from 'vue'
import {Editor, Toolbar} from '@wangeditor/editor-for-vue'
import {bmInfo, newsAdd} from "@/api/system/post";
import {koiNoticeError, koiNoticeSuccess} from "@/utils/koi.ts";
import {useRoute, useRouter} from 'vue-router';
import useTabsStore from "@/stores/modules/tabs.ts"; // useRoute
const router = useRouter();
const tabsStore = useTabsStore();
@ -72,8 +68,7 @@ const form = reactive({
subtitle: '',
reporter: '',
content: '',
coordinate_show: '',
video: '',
coordinate_show:'',
});
/*新闻坐标*/
const coordinate = ref();
@ -87,7 +82,7 @@ onMounted(() => {
})
const getBmInfo = async () => {
try {
const res: any = await bmInfo({ id: id.value });
const res: any = await bmInfo({id: id.value});
console.log("菜单数据表格数据->", res.data);
bmInfoData.value = res.data;
// koiNoticeSuccess("!");
@ -103,23 +98,23 @@ const onSubmit = async () => {
form.bm_id = id.value;
console.log(form);
if (form.new_name == '') {
if(form.new_name==''){
koiNoticeError("新闻标题不能为空!");
return;
}
if (form.reporter == '') {
if(form.reporter==''){
koiNoticeError("新闻记者不能为空!");
return;
}
if (form.coordinate == '' || typeof (form.coordinate) == 'undefined') {
if(form.coordinate=='' || typeof (form.coordinate)=='undefined'){
koiNoticeError("新闻坐标不能为空!");
return;
}
if (form.content == '') {
if(form.content==''){
koiNoticeError("新闻内容不能为空!");
return;
}
form.coordinate_show = `${rectCoordinates.value.x1},${rectCoordinates.value.y1},${rectCoordinates.value.x2},${rectCoordinates.value.y2}`;
form.coordinate_show=`${rectCoordinates.value.x1},${rectCoordinates.value.y1},${rectCoordinates.value.x2},${rectCoordinates.value.y2}`;
try {
const res: any = await newsAdd(form);
console.log("菜单数据表格数据->", res.data);
@ -163,8 +158,8 @@ const editorConfig = {
console.log(res);
// res url alt href
insertFn(res.data.fullurl, '', '')
}, onError: (file, err, res) => {
if (err.message.indexOf('exceeds maximum allowed size') !== -1) {
}, onError:(file, err, res)=>{
if(err.message.indexOf('exceeds maximum allowed size') !== -1){
koiNoticeError('图片限制为1M请调整好再上传');
}
},
@ -195,7 +190,7 @@ const imageWidth = ref(0); // 图片宽度
const imageHeight = ref(0); //
const imageLoaded = ref(false); //
const isDragging = ref(false); //
const dragStart = ref({ x: 0, y: 0 }); //
const dragStart = ref({x: 0, y: 0}); //
const allowClick = ref(true); //
const allowClickTrue = () => {
@ -231,8 +226,8 @@ const handleClick = (event) => {
const x = event.clientX - rect.left;
const y = event.clientY - rect.top;
//
points.value.push({ x, y });
showPoints.value.push({ xx, yy });
points.value.push({x, y});
showPoints.value.push({xx, yy});
console.log(`Clicked at: (${x}, ${y})`); //
console.log(`Clicked at: (${xx}, ${yy})`); //
// canvas
@ -290,7 +285,7 @@ const showCalculateRectangle = () => {
const y1 = Math.min(p1.yy, p2.yy, p3.yy, p4.yy);
const x2 = Math.max(p1.xx, p2.xx, p3.xx, p4.xx);
const y2 = Math.max(p1.yy, p2.yy, p3.yy, p4.yy);
s.value = { x1, y1, x2, y2 };
s.value = {x1, y1, x2, y2};
coordinate.value = `${x1},${y1},${x2},${y2}`;
};
//
@ -302,7 +297,7 @@ const calculateRectangle = () => {
const x2 = Math.max(p1.x, p2.x, p3.x, p4.x);
const y2 = Math.max(p1.y, p2.y, p3.y, p4.y);
rectCoordinates.value = { x1, y1, x2, y2 };
rectCoordinates.value = {x1, y1, x2, y2};
//
rect.value = {
@ -352,7 +347,7 @@ const startDrag = (event: MouseEvent) => {
if (rectCoordinates.value) { //
isDragging.value = true;
allowClick.value = false; //
dragStart.value = { x: event.clientX, y: event.clientY };
dragStart.value = {x: event.clientX, y: event.clientY};
}
};
@ -374,7 +369,7 @@ const onDrag = (event) => {
s.value.y2 += dy;
coordinate.value = `${s.value.x1},${s.value.x2},${s.value.y1},${s.value.y2}`;
//
dragStart.value = { x: event.clientX, y: event.clientY };
dragStart.value = {x: event.clientX, y: event.clientY};
//
drawRectanglePath(rectCoordinates.value.x1, rectCoordinates.value.y1, rectCoordinates.value.x2, rectCoordinates.value.y2);
}

View File

@ -20,23 +20,20 @@
</el-col>
<el-col :span="16">
<el-form :model="form" label-width="auto">
<el-form-item label="新闻标题" required>
<el-input v-model="form.new_name" placeholder="请输入新闻标题" size="large"/>
<el-form-item label="新闻标题">
<el-input v-model="form.new_name" size="large"/>
</el-form-item>
<el-form-item label="新闻副标题">
<el-input v-model="form.subtitle" placeholder="请输入新闻副标题" size="large"/>
<el-input v-model="form.subtitle" size="large"/>
</el-form-item>
<el-form-item label="新闻记者" required>
<el-input v-model="form.reporter" placeholder="请输入新闻记者" size="large"/>
<el-form-item label="新闻记者">
<el-input v-model="form.reporter" size="large"/>
</el-form-item>
<el-form-item label="新闻坐标" required>
<el-input disabled v-model="coordinate" placeholder="请选择新闻坐标" size="large"/>
<el-form-item label="新闻坐标">
<el-input disabled v-model="coordinate" size="large"/>
<el-button class="mt-2" @click="allowClickTrue()">重新选择</el-button>
</el-form-item>
<el-form-item label="新闻视频">
<el-input v-model="form.video" placeholder="请输入新闻视频" size="large"/>
</el-form-item>
<el-form-item label="新闻详情" required>
<el-form-item label="新闻详情">
<el-card shadow="hover">
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig"/>
<Editor style="height: 300px; overflow-y: hidden;" v-model="form.content" :defaultConfig="editorConfig"
@ -72,7 +69,6 @@ const form = reactive({
subtitle: '',
reporter: '',
content: '',
video: '',
});
/*新闻坐标 真实的*/
const coordinate = ref();
@ -99,7 +95,6 @@ const getNewsInfo = async () => {
form.bm_id = res.data.bm_id;
form.coordinate = res.data.coordinate;
form.coordinate_show=res.data.coordinate_show;
form.video = res.data.video;
coordinate.value = res.data.coordinate;
coordinateShow.value = res.data.coordinate_show;
await getBmInfo(res.data.bm_id);

View File

@ -58,13 +58,6 @@
</el-table-column>
<el-table-column label="操作" align="center" width="450px" fixed="right">
<template #default="{ row }">
<el-button v-if="row.level==1"
type="info"
@click="openA(row)"
>预览
</el-button>
<el-button v-if="row.level==1 && row.status==1"
type="primary"
@click="statusUpdate(row,0)"
@ -283,14 +276,6 @@ const Mp3Check = async (row) => {
}
}
const openA = (item) => {
console.log(item);
var url="https://jinrigushi.gushitv.com/#/?date="+item.datetime;
if(item.status==0){
url="https://jinrigushi.gushitv.com/#/?date="+item.datetime+"&status=1";
}
window.open(url);
}
/*PDF上传*/
const getFileList = (d) => {
console.log(d);
@ -495,7 +480,7 @@ const rowClick = (row, column, e) => {
//
const refreshTreeTable = ref(true);
// []
const isExpandAll = ref(true);
const isExpandAll = ref(false);
/** 添加 */
const handleAdd = () => {