feat: 完成管理后台冗余菜单、路由及无用页面的清理

pull/872/head
Trace 2026-04-17 21:54:12 +08:00
parent 2cb3b5b492
commit 1bd98e2f95
75 changed files with 357 additions and 241 deletions

10
.env
View File

@ -1,5 +1,5 @@
# 标题
VITE_APP_TITLE=芋道管理系统
VITE_APP_TITLE=空山管理系统
# 项目本地运行端口号
VITE_PORT=80
@ -13,15 +13,17 @@ VITE_APP_TENANT_ENABLE=true
# 验证码的开关
VITE_APP_CAPTCHA_ENABLE=true
# 文档地址的开关
# 文档地址提示条开关(空山版统一帮助入口)
VITE_APP_DOCALERT_ENABLE=true
# 统一帮助入口(帮助中心 / 内部Wiki
VITE_APP_HELP_CENTER_URL=http://m.swelife.cn/#/pages/index
# 百度统计
VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc
# 默认账户密码
VITE_APP_DEFAULT_LOGIN_TENANT = 芋道源码
VITE_APP_DEFAULT_LOGIN_USERNAME = admin
VITE_APP_DEFAULT_LOGIN_TENANT = 空山平台
VITE_APP_DEFAULT_LOGIN_USERNAME = admin
VITE_APP_DEFAULT_LOGIN_PASSWORD = admin123
# API 加解密

View File

@ -30,5 +30,10 @@ VITE_MALL_H5_DOMAIN='http://localhost:3000'
# 验证码的开关
VITE_APP_CAPTCHA_ENABLE=false
# 文档地址提示条开关(本地联调启用统一帮助入口)
VITE_APP_DOCALERT_ENABLE=true
# 统一帮助入口(帮助中心 / 内部Wiki
VITE_APP_HELP_CENTER_URL=http://m.swelife.cn/#/pages/index
# GoView域名
VITE_GOVIEW_URL='http://127.0.0.1:3000'

View File

@ -68,8 +68,8 @@ module.exports = defineConfig({
],
'vue/multi-word-component-names': 'off',
'vue/no-v-html': 'off',
'prettier/prettier': 'off', // 芋艿:默认关闭 prettier 的 ESLint 校验,因为我们使用的是 IDE 的 Prettier 插件
'@unocss/order': 'off', // 芋艿:禁用 unocss 【css】顺序的提示因为暂时不需要这么严格警告也有点繁琐
'@unocss/order-attributify': 'off' // 芋艿:禁用 unocss 【属性】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐
'prettier/prettier': 'off', // 项目组:默认关闭 prettier 的 ESLint 校验,因为我们使用的是 IDE 的 Prettier 插件
'@unocss/order': 'off', // 项目组:禁用 unocss 【css】顺序的提示因为暂时不需要这么严格警告也有点繁琐
'@unocss/order-attributify': 'off' // 项目组:禁用 unocss 【属性】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐
}
})

View File

@ -10,15 +10,15 @@
## 🐶 新手必读
* nodejs > 16.18.0 && pnpm > 8.6.0 (强制使用pnpm)
* 演示地址【Vue3 + element-plus】<http://dashboard-vue3.yudao.iocoder.cn>
* 演示地址【Vue3 + vben5.0(ant-design-vue)】:<http://dashboard-vben.yudao.iocoder.cn>
* 演示地址【Vue2 + element-ui】<http://dashboard.yudao.iocoder.cn>
* 启动文档:<https://doc.iocoder.cn/quick-start/>
* 视频教程:<https://doc.iocoder.cn/video/>
* 演示地址【Vue3 + element-plus】待补充
* 演示地址【Vue3 + vben5.0(ant-design-vue)】:待补充
* 演示地址【Vue2 + element-ui】待补充
* 启动文档:待补充
* 视频教程:待补充
## 🐯 平台简介
**芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用
**空山**,一个 AI + 电商平台项目,聚焦可持续迭代的业务开发与工程落地
* 采用 [vue-element-plus-admin](https://gitee.com/kailong110120130/vue-element-plus-admin) 实现
* 改换 saas自动引入等功能
@ -69,11 +69,11 @@
支持 Spring Boot、Spring Cloud 两种架构:
① Spring Boot 单体架构:<https://doc.iocoder.cn>
① Spring Boot 单体架构:待补充
![架构图](/.image/common/ruoyi-vue-pro-architecture.png)
② Spring Cloud 微服务架构:<https://cloud.iocoder.cn>
② Spring Cloud 微服务架构:待补充
![架构图](/.image/common/yudao-cloud-architecture.png)
@ -216,7 +216,7 @@
### 商城系统
演示地址:<https://doc.iocoder.cn/mall-preview/>
演示地址:待补充
![功能图](/.image/common/mall-feature.png)
@ -224,19 +224,19 @@
### ERP 系统
演示地址:<https://doc.iocoder.cn/erp-preview/>
演示地址:待补充
![功能图](/.image/common/erp-feature.png)
### CRM 系统
演示地址:<https://doc.iocoder.cn/crm-preview/>
演示地址:待补充
![功能图](/.image/common/crm-feature.png)
### AI 大模型
演示地址:<https://doc.iocoder.cn/ai-preview/>
演示地址:待补充
![功能图](/.image/common/ai-feature.png)

View File

@ -2,16 +2,16 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<link rel="icon" href="/brand-logo.png" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
name="keywords"
content="芋道管理系统 基于 vue3 + CompositionAPI + typescript + vite3 + element plus 的后台开源免费管理系统!"
content="空山管理系统 AI+电商平台 管理后台 vue3 typescript vite element-plus"
/>
<meta
name="description"
content="芋道管理系统 基于 vue3 + CompositionAPI + typescript + vite3 + element plus 的后台开源免费管理系统!"
content="空山 AI+电商平台管理后台,基于 Vue3 + TypeScript + Vite + Element Plus。"
/>
<title>%VITE_APP_TITLE%</title>
</head>
@ -65,7 +65,7 @@
position: absolute;
width: 100%;
height: 100%;
border: 4px solid #2d8cf0;
border: 4px solid #1e88e5;
border-bottom: 0;
border-left-color: transparent;
border-radius: 50%;
@ -78,7 +78,7 @@
left: calc(50% - 20px);
width: 40px;
height: 40px;
border: 4px solid #87bdff;
border: 4px solid #7fbaf2;
border-right: 0;
border-top-color: transparent;
border-radius: 50%;
@ -136,7 +136,7 @@
<div class="app-loading">
<div class="app-loading-wrap">
<div class="app-loading-title">
<img src="/logo.gif" class="app-loading-logo" alt="Logo" />
<img src="/brand-logo.png" class="app-loading-logo" alt="Logo" />
<div class="app-loading-title">%VITE_APP_TITLE%</div>
</div>
<div class="app-loading-item">

BIN
public/brand-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -95,7 +95,7 @@ export interface OrderItemRespVO {
orderPartPrice?: number | null //子订单分摊金额(总)
orderDividePrice?: number | null //分摊后子订单实付金额(总)
// ========== 营销基本信息 ==========
// TODO 芋艿:在捉摸一下
// TODO 项目组:在捉摸一下
// ========== 售后基本信息 ==========
afterSaleStatus?: number | null // 售后状态
properties?: ProductPropertiesVO[] //属性数组

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,47 @@
<svg width="128" height="128" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="ksAdminBg" x1="14%" y1="10%" x2="88%" y2="92%">
<stop offset="0%" stop-color="#0d47a1"/>
<stop offset="55%" stop-color="#1976d2"/>
<stop offset="100%" stop-color="#42a5f5"/>
</linearGradient>
<linearGradient id="ksAdminGlow" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#b3e5fc" stop-opacity="0.85"/>
<stop offset="100%" stop-color="#e1f5fe" stop-opacity="0.2"/>
</linearGradient>
</defs>
<circle cx="64" cy="64" r="60" fill="url(#ksAdminBg)"/>
<circle cx="64" cy="64" r="56" fill="none" stroke="url(#ksAdminGlow)" stroke-width="2"/>
<!-- AI circuit motif -->
<g stroke="#b3e5fc" stroke-width="2" stroke-linecap="round" opacity="0.85">
<path d="M18 44h12"/>
<path d="M98 44h12"/>
<path d="M20 84h10"/>
<path d="M98 84h10"/>
<path d="M31 30l7 7"/>
<path d="M90 30l-7 7"/>
</g>
<g fill="#e1f5fe" opacity="0.95">
<circle cx="18" cy="44" r="3"/>
<circle cx="110" cy="44" r="3"/>
<circle cx="20" cy="84" r="3"/>
<circle cx="110" cy="84" r="3"/>
<circle cx="31" cy="30" r="2.8"/>
<circle cx="90" cy="30" r="2.8"/>
</g>
<!-- Admin bust -->
<circle cx="64" cy="50" r="18" fill="#ffffff"/>
<path d="M32 96c4-14 17-22 32-22s28 8 32 22" fill="#ffffff"/>
<!-- Face details -->
<circle cx="57" cy="50" r="2.5" fill="#1e88e5"/>
<circle cx="71" cy="50" r="2.5" fill="#1e88e5"/>
<path d="M59 58c3.5 2.5 6.5 2.5 10 0" stroke="#1e88e5" stroke-width="2.6" fill="none" stroke-linecap="round"/>
<!-- Crown-like brand accent -->
<path d="M45 31l8-6 11 6 11-6 8 6v6H45z" fill="#ffd54f"/>
<circle cx="64" cy="31" r="2.8" fill="#ff8f00"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,36 @@
<svg width="128" height="128" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="ksNoticeBg" x1="10%" y1="8%" x2="88%" y2="90%">
<stop offset="0%" stop-color="#004d99"/>
<stop offset="55%" stop-color="#0288d1"/>
<stop offset="100%" stop-color="#29b6f6"/>
</linearGradient>
</defs>
<circle cx="64" cy="64" r="60" fill="url(#ksNoticeBg)"/>
<circle cx="64" cy="64" r="55" fill="none" stroke="#b3e5fc" stroke-opacity="0.45" stroke-width="2"/>
<!-- Shopping bag -->
<rect x="34" y="40" width="60" height="52" rx="8" fill="#ffffff"/>
<path d="M48 46c0-9 7-16 16-16s16 7 16 16" stroke="#1e88e5" stroke-width="4" fill="none" stroke-linecap="round"/>
<!-- AI chip symbol on bag -->
<rect x="50" y="56" width="28" height="20" rx="4" fill="#e3f2fd" stroke="#0288d1" stroke-width="2"/>
<g stroke="#0288d1" stroke-width="2" stroke-linecap="round">
<path d="M64 52v4"/>
<path d="M64 76v4"/>
<path d="M46 66h4"/>
<path d="M78 66h4"/>
<path d="M53 59l-3-3"/>
<path d="M75 59l3-3"/>
<path d="M53 73l-3 3"/>
<path d="M75 73l3 3"/>
</g>
<circle cx="64" cy="66" r="4.2" fill="#29b6f6"/>
<!-- Notification sparkle -->
<g fill="#ffd54f">
<path d="M95 28l3 7 7 3-7 3-3 7-3-7-7-3 7-3z"/>
<circle cx="28" cy="34" r="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -5,7 +5,7 @@
<el-avatar :size="60">
<Icon icon="ep:avatar" :size="60" />
</el-avatar>
<span class="text-18px font-bold">芋道源码</span>
<span class="text-18px font-bold">空山平台</span>
</div>
<Icon icon="tdesign:qrcode" :size="20" />
</div>

View File

@ -171,7 +171,7 @@
/>
<div class="flex flex-col">
<el-text>手机扫码预览</el-text>
<Qrcode :text="previewUrl" logo="/logo.gif" />
<Qrcode :text="previewUrl" logo="/brand-logo.png" />
</div>
</div>
</Dialog>

View File

@ -1,7 +1,9 @@
<template>
<el-alert v-if="getEnable()" type="success" show-icon>
<template #title>
<div @click="goToUrl">{{ '' + title + '' + url }}</div>
<div @click="goToUrl">
{{ '【' + (title || '模块说明') + '】空山帮助中心 / 内部Wiki' + helpCenterUrl }}
</div>
</template>
</el-alert>
</template>
@ -17,13 +19,15 @@ const props = defineProps({
/** 跳转 URL 链接 */
const goToUrl = () => {
window.open(props.url)
window.open(helpCenterUrl)
}
/** 是否开启 */
const getEnable = () => {
return import.meta.env.VITE_APP_DOCALERT_ENABLE !== 'false'
}
const helpCenterUrl = import.meta.env.VITE_APP_HELP_CENTER_URL || 'http://m.swelife.cn/#/pages/index'
</script>
<style scoped>
.el-alert--success.is-light {

View File

@ -36,7 +36,7 @@ export default defineComponent({
default: () => []
},
//
// update by true false
// update by true false
isCol: propTypes.bool.def(false),
//
model: {
@ -49,7 +49,7 @@ export default defineComponent({
isCustom: propTypes.bool.def(false),
// label
labelWidth: propTypes.oneOfType([String, Number]).def('auto'),
// loading add by
// loading add by
vLoading: propTypes.bool.def(false)
},
emits: ['register'],

View File

@ -100,7 +100,7 @@ const setVisible = () => {
</script>
<template>
<!-- update by 芋艿class="-mb-15px" 用于降低和 ContentWrap 组件的底部距离避免空隙过大 -->
<!-- update by 项目组class="-mb-15px" 用于降低和 ContentWrap 组件的底部距离避免空隙过大 -->
<Form
:inline="inline"
:is-col="isCol"
@ -113,12 +113,12 @@ const setVisible = () => {
>
<template #action>
<div v-if="layout === 'inline'">
<!-- update by 芋艿去除搜索的 type="primary"颜色变淡一点 -->
<!-- update by 项目组去除搜索的 type="primary"颜色变淡一点 -->
<ElButton v-if="showSearch" @click="search">
<Icon class="mr-5px" icon="ep:search" />
{{ t('common.query') }}
</ElButton>
<!-- update by 芋艿 icon="ep:refresh-right" 修改成 icon="ep:refresh" ruoyi-vue 搜索保持一致 -->
<!-- update by 项目组 icon="ep:refresh-right" 修改成 icon="ep:refresh" ruoyi-vue 搜索保持一致 -->
<ElButton v-if="showReset" @click="reset">
<Icon class="mr-5px" icon="ep:refresh" />
{{ t('common.reset') }}
@ -127,7 +127,7 @@ const setVisible = () => {
{{ t(visible ? 'common.shrink' : 'common.expand') }}
<Icon :icon="visible ? 'ep:arrow-up' : 'ep:arrow-down'" />
</ElButton>
<!-- add by 芋艿补充在搜索后的按钮 -->
<!-- add by 项目组补充在搜索后的按钮 -->
<slot name="actionMore"></slot>
</div>
</template>
@ -150,7 +150,7 @@ const setVisible = () => {
{{ t(visible ? 'common.shrink' : 'common.expand') }}
<Icon :icon="visible ? 'ep:arrow-up' : 'ep:arrow-down'" />
</ElButton>
<!-- add by 芋艿补充在搜索后的按钮 -->
<!-- add by 项目组补充在搜索后的按钮 -->
<slot name="actionMore"></slot>
</div>
</template>

View File

@ -118,7 +118,7 @@ export function useFormFields() {
return parseFormCreateFields(unref(formFields))
}
// TODO @芋艿:后续需要把各种类似 useFormFieldsPermission 的逻辑,抽成一个通用方法。
// TODO @项目组:后续需要把各种类似 useFormFieldsPermission 的逻辑,抽成一个通用方法。
/**
* @description
*/

View File

@ -105,7 +105,7 @@ export default defineComponent({
})
const pagination = computed(() => {
// update by Pagination
// update by Pagination
return Object.assign(
{
small: false,
@ -285,7 +285,7 @@ export default defineComponent({
}}
</ElTable>
{unref(getProps).pagination ? (
// update by Pagination
// update by Pagination
<ElPagination
v-model:pageSize={pageSizeRef.value}
v-model:currentPage={currentPageRef.value}

View File

@ -1,5 +1,5 @@
<!-- 列表选择通用组件参考 ProductList 组件使用 -->
<!-- TODO 芋艿可能会移除 -->
<!-- TODO 项目组可能会移除 -->
<template>
<Dialog v-model="dialogVisible" :appendToBody="true" :scroll="true" :title="title" width="60%">
<el-table

View File

@ -642,7 +642,7 @@ const previewProcessJson = () => {
})
}
/* ------------------------------------------------ 芋道源码 methods ------------------------------------------------------ */
/* ------------------------------------------------ 空山团队 methods ------------------------------------------------------ */
onMounted(() => {
initBpmnModeler()
createNewDiagram(props.value)

View File

@ -208,7 +208,7 @@ const clearViewer = () => {
}
/** 添加自定义箭头 */
// TODO marker-endmarker-start
// TODO marker-endmarker-start
const addCustomDefs = () => {
if (!bpmnViewer.value) {
return

View File

@ -99,7 +99,7 @@ const handleNameUpdate = (value) => {
}, 100)
}
// const handleDescriptionUpdate=(value)=> {
// TODO documentation
// TODO documentation
// this.elementBaseInfo['documentation'] = value;
// this.updateBaseInfo('documentation');
// }

View File

@ -60,7 +60,7 @@
<el-form-item label="集合" key="collection" v-show="false">
<el-input v-model="loopInstanceForm.collection" clearable @change="updateLoopBase" />
</el-form-item>
<!-- add by 芋艿由于元素变量暂时用不到所以这里 display none -->
<!-- add by 项目组由于元素变量暂时用不到所以这里 display none -->
<el-form-item label="元素变量" key="elementVariable" style="display: none">
<el-input v-model="loopInstanceForm.elementVariable" clearable @change="updateLoopBase" />
</el-form-item>
@ -71,7 +71,7 @@
@change="updateLoopCondition"
/>
</el-form-item>
<!-- add by 芋艿由于异步状态暂时用不到所以这里 display none -->
<!-- add by 项目组由于异步状态暂时用不到所以这里 display none -->
<el-form-item label="异步状态" key="async" style="display: none">
<el-checkbox
v-model="loopInstanceForm.asyncBefore"

View File

@ -1,7 +1,7 @@
<template>
<div class="panel-tab__content">
<el-form size="small" label-width="90px">
<!-- add by 芋艿由于异步延续暂时用不到所以这里 display none -->
<!-- add by 项目组由于异步延续暂时用不到所以这里 display none -->
<el-form-item label="异步延续" style="display: none">
<el-checkbox
v-model="taskConfigForm.asyncBefore"

View File

@ -354,7 +354,7 @@ const resetTaskForm = () => {
const changeCandidateStrategy = () => {
userTaskForm.value.candidateParam = []
deptLevel.value = 1
// by https://t.zsxq.com/xNmas
// by https://t.zsxq.com/xNmas
// if (userTaskForm.value.candidateStrategy === CandidateStrategy.FORM_USER) {
// //
// if (!userFieldOnFormOptions.value || userFieldOnFormOptions.value.length <= 1) {

View File

@ -162,7 +162,7 @@ const filterTableSchema = (crudSchema: CrudSchema[]): TableColumn[] => {
const tableColumns = treeMap<CrudSchema>(crudSchema, {
conversion: (schema: CrudSchema) => {
if (schema?.isTable !== false && schema?.table?.show !== false) {
// add by 芋艿:增加对 dict 字典数据的支持
// add by 项目组:增加对 dict 字典数据的支持
if (!schema.formatter && schema.dictType) {
schema.formatter = (_: Recordable, __: TableColumn, cellValue: any) => {
return h(DictTag, {

View File

@ -217,7 +217,7 @@ export const useTable = <T = any>(config?: UseTableConfig<T>) => {
elTableRef,
tableObject,
methods,
// add by 芋艿:返回 tableMethods 属性,和 tableObject 更统一
// add by 项目组:返回 tableMethods 属性,和 tableObject 更统一
tableMethods: methods
}
}

View File

@ -68,7 +68,7 @@ watch(
>
<img
class="h-[calc(var(--logo-height)-10px)] w-[calc(var(--logo-height)-10px)]"
src="@/assets/imgs/logo.png"
src="/brand-logo.png"
/>
<div
v-if="show"

View File

@ -50,7 +50,7 @@ const toProfile = async () => {
push('/user/profile')
}
const toDocument = () => {
window.open('https://doc.iocoder.cn/')
window.open('http://m.swelife.cn/#/pages/index')
}
</script>

View File

@ -7,7 +7,7 @@ export default {
login: 'Login',
required: 'This is required',
loginOut: 'Login out',
document: 'Document',
document: 'Project Portal',
profile: 'User Center',
reminder: 'Reminder',
loginOutMessage: 'Exit the system?',
@ -113,8 +113,8 @@ export default {
small: 'Small'
},
login: {
welcome: 'Welcome to the system',
message: 'Backstage management system',
welcome: 'Welcome to Kongshan AI + E-commerce Platform',
message: 'An operations console focused on AI-enabled commerce',
tenantname: 'TenantName',
username: 'Username',
password: 'Password',
@ -163,10 +163,10 @@ export default {
analysis: {
newUser: 'New user',
unreadInformation: 'Unread information',
transactionAmount: 'Transaction amount',
totalShopping: 'Total Shopping',
monthlySales: 'Monthly sales',
userAccessSource: 'User access source',
transactionAmount: 'GMV',
totalShopping: 'Paid Orders',
monthlySales: 'Monthly Sales Trend',
userAccessSource: 'Traffic Sources',
january: 'January',
february: 'February',
march: 'March',
@ -179,15 +179,15 @@ export default {
october: 'October',
november: 'November',
december: 'December',
estimate: 'Estimate',
estimate: 'Target',
actual: 'Actual',
directAccess: 'Airect access',
mailMarketing: 'Mail marketing',
allianceAdvertising: 'Alliance advertising',
videoAdvertising: 'Video advertising',
searchEngines: 'Search engines',
weeklyUserActivity: 'Weekly user activity',
activeQuantity: 'Active quantity',
directAccess: 'Organic',
mailMarketing: 'Private Domain',
allianceAdvertising: 'Paid Channels',
videoAdvertising: 'Short Video',
searchEngines: 'Search',
weeklyUserActivity: 'Weekly Ops Activity',
activeQuantity: 'Activity Index',
monday: 'Monday',
tuesday: 'Tuesday',
wednesday: 'Wednesday',
@ -199,13 +199,13 @@ export default {
workplace: {
welcome: 'Hello',
happyDay: 'Wish you happy every day!',
toady: `It's sunny today`,
notice: 'Announcement',
project: 'Project',
access: 'Project access',
toDo: 'To do',
toady: 'Today Focus',
notice: 'Operations Bulletin',
project: 'Business Modules',
access: 'Site Visits',
toDo: 'Pending Tasks',
introduction: 'A serious introduction',
shortcutOperation: 'Quick entry',
shortcutOperation: 'Operations Shortcuts',
operation: 'Operation',
index: 'Index',
personal: 'Personal',
@ -376,8 +376,8 @@ export default {
signUpFormTitle: 'Sign up',
forgetFormTitle: 'Reset password',
signInTitle: 'Backstage management system',
signInDesc: 'Enter your personal details and get started!',
signInTitle: 'Kongshan AI + E-commerce Admin Console',
signInDesc: 'Sign in with your account to start managing the platform',
policy: 'I agree to the xxx Privacy Policy',
scanSign: `scanning the code to complete the login`,

View File

@ -7,7 +7,7 @@ export default {
login: '登录',
required: '该项为必填项',
loginOut: '退出系统',
document: '项目文档',
document: '项目入口',
profile: '个人中心',
reminder: '温馨提示',
loginOutMessage: '是否退出本系统?',
@ -114,8 +114,8 @@ export default {
small: '小'
},
login: {
welcome: '欢迎使用本系统',
message: '开箱即用的中后台管理系统',
welcome: '欢迎使用空山 AI+电商平台',
message: '聚焦 AI 赋能实业的电商中后台管理系统',
tenantname: '租户名称',
username: '用户名',
password: '密码',
@ -165,10 +165,10 @@ export default {
analysis: {
newUser: '新增用户',
unreadInformation: '未读消息',
transactionAmount: '成交额',
totalShopping: '购物总量',
monthlySales: '每月销售额',
userAccessSource: '用户访问来源',
transactionAmount: 'GMV 成交额',
totalShopping: '支付订单量',
monthlySales: '月度销售趋势',
userAccessSource: '流量渠道来源',
january: '一月',
february: '二月',
march: '三月',
@ -181,15 +181,15 @@ export default {
october: '十月',
november: '十一月',
december: '十二月',
estimate: '预计',
estimate: '目标',
actual: '实际',
directAccess: '直接访问',
mailMarketing: '邮件营销',
allianceAdvertising: '联盟广告',
videoAdvertising: '视频广告',
searchEngines: '搜索引擎',
weeklyUserActivity: '每周用户活跃量',
activeQuantity: '活跃',
directAccess: '自然访问',
mailMarketing: '私域触达',
allianceAdvertising: '渠道投放',
videoAdvertising: '短视频内容',
searchEngines: '搜索流量',
weeklyUserActivity: '每周经营活跃度',
activeQuantity: '活跃指标',
monday: '周一',
tuesday: '周二',
wednesday: '周三',
@ -201,13 +201,13 @@ export default {
workplace: {
welcome: '你好',
happyDay: '祝你开心每一天!',
toady: '今日',
notice: '通知公告',
project: '项目数',
access: '项目访问',
toDo: '待',
toady: '今日运营重点',
notice: '运营公告',
project: '业务模块',
access: '全站访问',
toDo: '待处理',
introduction: '一个正经的简介',
shortcutOperation: '快捷入口',
shortcutOperation: '运营快捷入口',
operation: '操作',
index: '指数',
personal: '个人',
@ -374,8 +374,8 @@ export default {
qrSignInFormTitle: '二维码登录',
signUpFormTitle: '注册',
forgetFormTitle: '重置密码',
signInTitle: '开箱即用的中后台管理系统',
signInDesc: '输入您的个人详细信息开始使用!',
signInTitle: '空山 AI+电商平台管理端',
signInDesc: '输入账号信息后开始使用平台能力',
policy: '我同意xxx隐私政策',
scanSign: `扫码后点击"确认",即可完成登录`,
loginButton: '登录',

View File

@ -73,13 +73,13 @@ export const useAppStore = defineStore('app', {
currentSize: wsCache.get('default') || 'default', // 组件尺寸
theme: wsCache.get(CACHE_KEY.THEME) || {
// 主题色
elColorPrimary: '#409eff',
elColorPrimary: '#1e88e5',
// 左侧菜单边框颜色
leftMenuBorderColor: 'inherit',
// 左侧菜单背景颜色
leftMenuBgColor: '#001529',
leftMenuBgColor: '#0f4c9a',
// 左侧菜单浅色背景颜色
leftMenuBgLightColor: '#0f2438',
leftMenuBgLightColor: '#1763c3',
// 左侧菜单选中背景颜色
leftMenuBgActiveColor: 'var(--el-color-primary)',
// 左侧菜单收起选中背景颜色
@ -93,11 +93,11 @@ export const useAppStore = defineStore('app', {
// logo边框颜色
logoBorderColor: 'inherit',
// 头部背景颜色
topHeaderBgColor: '#fff',
topHeaderBgColor: '#f5f9ff',
// 头部字体颜色
topHeaderTextColor: 'inherit',
// 头部悬停颜色
topHeaderHoverColor: '#f6f6f6',
topHeaderHoverColor: '#eaf2ff',
// 头部边框颜色
topToolBorderColor: '#eee'
}

View File

@ -1,5 +1,5 @@
/**
* Created by
* Created by
*
*
*/

View File

@ -1,7 +1,7 @@
/**
* Independent time operation tool to facilitate subsequent switch to dayjs
*/
// TODO 芋艿:【锁屏】可能后面删除掉
// TODO 项目组:【锁屏】可能后面删除掉
import dayjs from 'dayjs'
const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'

View File

@ -240,7 +240,7 @@ export enum DICT_TYPE {
IOT_THING_MODEL_TYPE = 'iot_thing_model_type', // IOT 产品功能类型
IOT_THING_MODEL_UNIT = 'iot_thing_model_unit', // IOT 物模型单位
IOT_RW_TYPE = 'iot_rw_type', // IOT 读写类型
// TODO @芋艿:貌似这几个多了 _enum 后缀
// TODO @项目组:貌似这几个多了 _enum 后缀
IOT_DATA_SINK_TYPE_ENUM = 'iot_data_sink_type_enum', // IoT 数据流转目的类型
IOT_RULE_SCENE_TRIGGER_TYPE_ENUM = 'iot_rule_scene_trigger_type_enum', // IoT 场景流转的触发类型枚举
IOT_RULE_SCENE_ACTION_TYPE_ENUM = 'iot_rule_scene_action_type_enum', // IoT 规则场景的触发类型枚举

View File

@ -328,7 +328,7 @@ export const formatToFraction = (num: number | string | undefined): string => {
*
* @param num
*/
// TODO @芋艿:看看怎么融合掉
// TODO @项目组:看看怎么融合掉
export const floatToFixed2 = (num: number | string | undefined): string => {
let str = '0.00'
if (typeof num === 'undefined') {
@ -355,7 +355,7 @@ export const floatToFixed2 = (num: number | string | undefined): string => {
*
* @param num
*/
// TODO @芋艿:看看怎么融合掉
// TODO @项目组:看看怎么融合掉
export const convertToInteger = (num: number | string | undefined): number => {
if (typeof num === 'undefined') return 0
const parsedNumber = typeof num === 'string' ? parseFloat(num) : num

View File

@ -6,14 +6,14 @@
<el-col :xl="12" :lg="12" :md="12" :sm="24" :xs="24">
<div class="flex items-center">
<el-avatar :src="avatar" :size="70" class="mr-16px">
<img src="@/assets/imgs/avatar.gif" alt="" />
<img :src="avatar" alt="" />
</el-avatar>
<div>
<div class="text-20px">
{{ t('workplace.welcome') }} {{ username }} {{ t('workplace.happyDay') }}
</div>
<div class="mt-10px text-14px text-gray-500">
{{ t('workplace.toady') }}20 - 32
{{ t('workplace.toady') }}转化率客单价复购率
</div>
</div>
</div>
@ -65,7 +65,7 @@
<el-link
type="primary"
:underline="false"
href="https://github.com/yudaocode"
href="https://github.com/"
target="_blank"
>
{{ t('action.more') }}
@ -86,7 +86,7 @@
<el-card
shadow="hover"
class="mr-5px mt-5px cursor-pointer"
@click="handleProjectClick(item.message)"
@click="handleProjectClick(item.url)"
>
<div class="flex items-center">
<Icon
@ -97,7 +97,7 @@
/>
<span class="text-16px">{{ item.name }}</span>
</div>
<div class="mt-12px text-12px text-gray-400">{{ t(item.message) }}</div>
<div class="mt-12px text-12px text-gray-400">{{ item.message }}</div>
<div class="mt-12px flex justify-between text-12px text-gray-400">
<span>{{ item.personal }}</span>
<span>{{ formatTime(item.time, 'yyyy-MM-dd') }}</span>
@ -159,8 +159,8 @@
<el-skeleton :loading="loading" animated>
<div v-for="(item, index) in notice" :key="`dynamics-${index}`">
<div class="flex items-center">
<el-avatar :src="avatar" :size="35" class="mr-16px">
<img src="@/assets/imgs/avatar.gif" alt="" />
<el-avatar :src="noticeAvatar" :size="35" class="mr-16px">
<img :src="noticeAvatar" alt="" />
</el-avatar>
<div>
<div class="text-14px">
@ -184,6 +184,8 @@
import { set } from 'lodash-es'
import { EChartsOption } from 'echarts'
import { formatTime } from '@/utils'
import adminAvatar from '@/assets/imgs/kongshan-admin-avatar.svg'
import noticeAvatar from '@/assets/imgs/kongshan-notice-avatar.svg'
import { useUserStore } from '@/store/modules/user'
// import { useWatermark } from '@/hooks/web/useWatermark'
@ -198,7 +200,7 @@ const router = useRouter()
const userStore = useUserStore()
// const { setWatermark } = useWatermark()
const loading = ref(true)
const avatar = userStore.getUser.avatar
const avatar = adminAvatar
const username = userStore.getUser.nickname
const pieOptionsData = reactive<EChartsOption>(pieOptions) as EChartsOption
//
@ -210,9 +212,9 @@ let totalSate = reactive<WorkplaceTotal>({
const getCount = async () => {
const data = {
project: 40,
access: 2340,
todo: 10
project: 28,
access: 18640,
todo: 7
}
totalSate = Object.assign(totalSate, data)
}
@ -222,52 +224,58 @@ let projects = reactive<Project[]>([])
const getProject = async () => {
const data = [
{
name: 'ruoyi-vue-pro',
icon: 'simple-icons:springboot',
message: 'github.com/YunaiV/ruoyi-vue-pro',
personal: 'Spring Boot 单体架构',
time: new Date('2025-01-02'),
color: '#6DB33F'
},
{
name: 'yudao-ui-admin-vue3',
icon: 'ep:element-plus',
message: 'github.com/yudaocode/yudao-ui-admin-vue3',
personal: 'Vue3 + element-plus 管理后台',
time: new Date('2025-02-03'),
name: '空山管理后台',
icon: 'ep:monitor',
message: 'kshan.yootron.net',
url: 'https://kshan.yootron.net/',
personal: 'Vue3 + Element Plus 管理端',
time: new Date('2026-04-10'),
color: '#409EFF'
},
{
name: 'yudao-ui-mall-uniapp',
name: '空山商城 H5',
icon: 'icon-park-outline:mall-bag',
message: 'github.com/yudaocode/yudao-ui-mall-uniapp',
personal: 'Vue3 + uniapp 商城手机端',
time: new Date('2025-03-04'),
color: '#ff4d4f'
message: 'm.swelife.cn/#/pages/index',
url: 'http://m.swelife.cn/#/pages/index',
personal: '用户端商城与活动运营',
time: new Date('2026-04-11'),
color: '#ff6b6b'
},
{
name: 'yudao-cloud',
icon: 'material-symbols:cloud-outline',
message: 'github.com/YunaiV/yudao-cloud',
personal: 'Spring Cloud 微服务架构',
time: new Date('2025-04-05'),
color: '#1890ff'
name: '空山 AI 助手',
icon: 'tabler:ai',
message: 'kshan.yootron.net',
url: '/ai/chat',
personal: '客服/内容/运营 AI 工作台',
time: new Date('2026-04-12'),
color: '#7c3aed'
},
{
name: 'yudao-ui-admin-vben',
icon: 'devicon:antdesign',
message: 'github.com/yudaocode/yudao-ui-admin-vben',
personal: 'Vue3 + vben5(antd) 管理后台',
time: new Date('2025-05-06'),
color: '#e18525'
name: '订单履约中心',
icon: 'solar:box-outline',
message: 'kshan.yootron.net',
url: '/mall/trade/order',
personal: '订单、发货、售后与履约监控',
time: new Date('2026-04-13'),
color: '#14b8a6'
},
{
name: 'yudao-ui-admin-uniapp',
icon: 'ant-design:mobile',
message: 'github.com/yudaocode/yudao-ui-admin-uniapp',
personal: 'Vue3 + uniapp 管理手机端',
time: new Date('2025-06-01'),
color: '#2979ff'
name: '会员增长中心',
icon: 'mdi:account-group-outline',
message: 'kshan.yootron.net',
url: '/member/user',
personal: '会员分层、积分、营销活动',
time: new Date('2026-04-14'),
color: '#f59e0b'
},
{
name: '数据与报表中心',
icon: 'carbon:chart-line-data',
message: 'kshan.yootron.net',
url: '/report/jmreport',
personal: '经营数据、渠道分析、复盘报表',
time: new Date('2026-04-15'),
color: '#0ea5e9'
}
]
projects = Object.assign(projects, data)
@ -278,27 +286,27 @@ let notice = reactive<Notice[]>([])
const getNotice = async () => {
const data = [
{
title: '系统支持 JDK 8/17/21Vue 2/3',
type: '技术兼容性',
keys: ['JDK', 'Vue'],
title: '空山 V1 联调已打通,管理端与后端可稳定登录',
type: '项目进展',
keys: ['联调', '登录'],
date: new Date()
},
{
title: '后端提供 Spring Boot 2.7/3.2 + Cloud 双架构',
type: '架构灵活性',
keys: ['Boot', 'Cloud'],
title: 'AI+电商看板上线,支持客服与运营场景快速入口',
type: '功能更新',
keys: ['AI', '运营'],
date: new Date()
},
{
title: '全部开源,个人与企业可 100% 直接使用,无需授权',
type: '开源免授权',
keys: ['无需授权'],
title: '本周重点:商品中心、订单履约、会员体系数据校验',
type: '本周任务',
keys: ['商品', '订单'],
date: new Date()
},
{
title: '国内使用最广泛的快速开发平台,远超 10w+ 企业使用',
type: '广泛企业认可',
keys: ['最广泛', '10w+'],
title: '研发协同规范:需求、问题、上线节奏统一在任务平台跟踪',
type: '协作规范',
keys: ['需求', '问题反馈'],
date: new Date()
}
]
@ -317,7 +325,7 @@ const getShortcut = async () => {
color: '#1fdaca'
},
{
name: '商中心',
name: '商中心',
icon: 'ep:shop',
url: '/mall/home',
color: '#ff6b6b'
@ -329,21 +337,21 @@ const getShortcut = async () => {
color: '#7c3aed'
},
{
name: 'ERP 系统',
name: '订单履约',
icon: 'simple-icons:erpnext',
url: '/erp/home',
color: '#3fb27f'
},
{
name: 'CRM 系统',
name: '会员运营',
icon: 'simple-icons:civicrm',
url: '/crm/backlog',
color: '#4daf1bc9'
},
{
name: 'IoT 物联网',
icon: 'fa-solid:hdd',
url: '/iot/home',
name: '数据看板',
icon: 'mdi:chart-bar',
url: '/report/jmreport',
color: '#1a73e8'
}
]
@ -410,8 +418,12 @@ const getAllApi = async () => {
loading.value = false
}
const handleProjectClick = (message: string) => {
window.open(`https://${message}`, '_blank')
const handleProjectClick = (url: string) => {
if (url.startsWith('http://') || url.startsWith('https://')) {
window.open(url, '_blank')
return
}
router.push(url)
}
const handleShortcutClick = (url: string) => {

View File

@ -8,6 +8,7 @@ export type Project = {
name: string
icon: string
message: string
url: string
personal: string
time: Date | number | string
color: string

View File

@ -5,11 +5,11 @@
>
<div class="relative mx-auto h-full flex">
<div
:class="`${prefixCls}__left flex-1 bg-gray-500 bg-opacity-20 relative p-30px lt-xl:hidden overflow-x-hidden overflow-y-auto`"
:class="`${prefixCls}__left flex-1 relative p-30px lt-xl:hidden overflow-x-hidden overflow-y-auto`"
>
<!-- 左上角的 logo + 系统标题 -->
<div class="relative flex items-center text-white">
<img alt="" class="mr-10px h-48px w-48px" src="@/assets/imgs/logo.png" />
<img alt="" class="mr-10px h-48px w-48px" src="/brand-logo.png" />
<span class="text-20px font-bold">{{ underlineToHump(appStore.getTitle) }}</span>
</div>
<!-- 左边的背景图 + 欢迎语 -->
@ -19,9 +19,9 @@
enter-active-class="animate__animated animate__bounceInLeft"
tag="div"
>
<img key="1" alt="" class="w-350px" src="@/assets/svgs/login-box-bg.svg" />
<div key="2" class="text-3xl text-white">{{ t('login.welcome') }}</div>
<div key="3" class="mt-5 text-14px font-normal text-white">
<img key="1" alt="" class="w-350px rounded-16px shadow-lg" src="@/assets/svgs/login-box-bg.svg" />
<div key="2" class="text-3xl text-white font-700">{{ t('login.welcome') }}</div>
<div key="3" class="mt-5 text-14px font-normal text-white/90">
{{ t('login.message') }}
</div>
</TransitionGroup>
@ -36,7 +36,7 @@
style="color: var(--el-text-color-primary);"
>
<div class="flex items-center at-2xl:hidden at-xl:hidden">
<img alt="" class="mr-10px h-48px w-48px" src="@/assets/imgs/logo.png" />
<img alt="" class="mr-10px h-48px w-48px" src="/brand-logo.png" />
<span class="text-20px font-bold" >{{ underlineToHump(appStore.getTitle) }}</span>
</div>
<div class="flex items-center justify-end space-x-10px h-48px">
@ -92,6 +92,8 @@ $prefix-cls: #{$namespace}-login;
overflow: auto;
&__left {
background: linear-gradient(135deg, #0f4c9a 0%, #1e88e5 55%, #46b3ff 100%);
&::before {
position: absolute;
top: 0;
@ -102,6 +104,7 @@ $prefix-cls: #{$namespace}-login;
background-image: url('@/assets/svgs/login-bg.svg');
background-position: center;
background-repeat: no-repeat;
opacity: 0.18;
content: '';
}
}

View File

@ -9,7 +9,7 @@
>
<!-- 左上角的 logo + 系统标题 -->
<div class="relative flex items-center text-white">
<img alt="" class="mr-10px h-48px w-48px" src="@/assets/imgs/logo.png" />
<img alt="" class="mr-10px h-48px w-48px" src="/brand-logo.png" />
<span class="text-20px font-bold">{{ underlineToHump(appStore.getTitle) }}</span>
</div>
<!-- 左边的背景图 + 欢迎语 -->
@ -35,7 +35,7 @@
class="flex items-center justify-between text-white at-2xl:justify-end at-xl:justify-end"
>
<div class="flex items-center at-2xl:hidden at-xl:hidden">
<img alt="" class="mr-10px h-48px w-48px" src="@/assets/imgs/logo.png" />
<img alt="" class="mr-10px h-48px w-48px" src="/brand-logo.png" />
<span class="text-20px font-bold">{{ underlineToHump(appStore.getTitle) }}</span>
</div>
<div class="flex items-center justify-end space-x-10px h-48px">
@ -199,7 +199,7 @@ const loginData = reactive({
captchaEnable: import.meta.env.VITE_APP_CAPTCHA_ENABLE !== 'false',
tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE !== 'false',
loginForm: {
tenantName: '芋道源码',
tenantName: '空山平台',
username: 'admin',
password: 'admin123',
captchaVerification: '',

View File

@ -129,17 +129,17 @@
</div>
</el-form-item>
</el-col>
<el-divider content-position="center">萌新必读</el-divider>
<el-divider content-position="center">空山项目入口</el-divider>
<el-col :span="24" class="px-10px">
<el-form-item>
<div class="w-full flex justify-between">
<el-link href="https://doc.iocoder.cn/" target="_blank">📚开发指南</el-link>
<el-link href="https://doc.iocoder.cn/video/" target="_blank">🔥视频教程</el-link>
<el-link href="https://www.iocoder.cn/Interview/good-collection/" target="_blank">
面试手册
<el-link href="http://m.swelife.cn/#/pages/index" target="_blank">🏠项目官网</el-link>
<el-link href="http://127.0.0.1:5173/" target="_blank">🧭管理端入口</el-link>
<el-link href="https://github.com/" target="_blank">
📋需求与任务
</el-link>
<el-link href="http://static.yudao.iocoder.cn/mp/Aix9975.jpeg" target="_blank">
🤝外包咨询
<el-link href="https://github.com/" target="_blank">
🛠问题反馈
</el-link>
</div>
</el-form-item>

View File

@ -133,7 +133,7 @@ const loginData = reactive({
},
loginForm: {
uuid: '',
tenantName: '芋道源码',
tenantName: '空山平台',
mobileNumber: '',
code: ''
}

View File

@ -17,7 +17,7 @@
</el-row>
</template>
<script lang="ts" setup>
import logoImg from '@/assets/imgs/logo.png'
const logoImg = '/brand-logo.png'
import LoginFormTitle from './LoginFormTitle.vue'
import { LoginStateEnum, useLoginState } from './useLogin'

View File

@ -1,5 +1,5 @@
<template>
<!-- TODO @芋艿可优化对标 vben 版本 -->
<!-- TODO @项目组可优化对标 vben 版本 -->
<div class="flex">
<el-card class="user w-1/3" shadow="hover">
<template #header>

View File

@ -3,7 +3,7 @@
<div class="relative flex flex-row justify-center w-full h-full">
<!-- title -->
<div class="flex flex-col justify-center">
<div class="text-28px font-bold text-center">芋道 AI</div>
<div class="text-28px font-bold text-center">空山 AI</div>
<div class="flex flex-row flex-wrap items-center justify-center w-460px mt-20px">
<div
class="flex justify-center w-180px leading-50px border border-solid border-[#e4e4e4] rounded-10px m-10px cursor-pointer hover:bg-[rgba(243,243,243,0.73)]"
@ -20,10 +20,16 @@
<script setup lang="ts">
const promptList = [
{
prompt: '今天气怎么样?'
prompt: '帮我分析本周店铺转化率下降的可能原因'
},
{
prompt: '写一首好听的诗歌?'
prompt: '给我生成一份大促活动商品文案与主图卖点'
},
{
prompt: '根据近30天订单数据给出会员复购提升建议'
},
{
prompt: '为新上架商品生成客服常见问题回复话术'
}
] // prompt

View File

@ -70,7 +70,7 @@
<!-- 底部 -->
<el-footer class="flex flex-col !h-auto !p-0">
<!-- TODO @芋艿这块要想办法迁移下 -->
<!-- TODO @项目组这块要想办法迁移下 -->
<form
class="mt-10px mx-20px mb-20px py-9px px-10px flex flex-col h-auto rounded-10px"
style="border: 1px solid var(--el-border-color)"
@ -393,7 +393,7 @@ const handlePromptInput = (event) => {
isComposing.value = false
}, 400)
}
// TODO @ @keydown.enter@keydown.shift.enter shift+ isComposing
// TODO @ @keydown.enter@keydown.shift.enter shift+ isComposing
const onCompositionstart = () => {
isComposing.value = true
}

View File

@ -1,5 +1,5 @@
/**
* Created by
* Created by
*
* AI
*

View File

@ -1,5 +1,5 @@
/**
* Created by
* Created by
*
* AI
*

View File

@ -812,7 +812,7 @@ const handleAudit = async (pass: boolean, formRef: FormInstance | undefined) =>
data.signPicUrl = approveReasonForm.signPicUrl
}
// approveForm + data
// TODO
// TODO
const formCreateApi = approveFormFApi.value
if (Object.keys(formCreateApi)?.length > 0) {
await formCreateApi.validate()

View File

@ -44,7 +44,7 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list">
<!-- TODO 芋艿增加摘要 -->
<!-- TODO 项目组增加摘要 -->
<el-table-column align="center" label="流程名" prop="processInstanceName" min-width="180" />
<el-table-column label="摘要" prop="summary" min-width="180">
<template #default="scope">

View File

@ -389,6 +389,6 @@ onMounted(async () => {
userList.value = await UserApi.getSimpleUserList()
accountList.value = await AccountApi.getAccountSimpleList()
})
// TODO
// TODO
// TODO
// TODO
</script>

View File

@ -389,6 +389,6 @@ onMounted(async () => {
userList.value = await UserApi.getSimpleUserList()
accountList.value = await AccountApi.getAccountSimpleList()
})
// TODO
// TODO
// TODO
// TODO
</script>

View File

@ -438,6 +438,6 @@ onMounted(async () => {
warehouseList.value = await WarehouseApi.getWarehouseSimpleList()
accountList.value = await AccountApi.getAccountSimpleList()
})
// TODO
// TODO
// TODO
// TODO
</script>

View File

@ -402,6 +402,6 @@ onMounted(async () => {
supplierList.value = await SupplierApi.getSupplierSimpleList()
userList.value = await UserApi.getSimpleUserList()
})
// TODO
// TODO
// TODO
// TODO
</script>

View File

@ -438,6 +438,6 @@ onMounted(async () => {
warehouseList.value = await WarehouseApi.getWarehouseSimpleList()
accountList.value = await AccountApi.getAccountSimpleList()
})
// TODO
// TODO
// TODO
// TODO
</script>

View File

@ -402,6 +402,6 @@ onMounted(async () => {
customerList.value = await CustomerApi.getCustomerSimpleList()
userList.value = await UserApi.getSimpleUserList()
})
// TODO
// TODO
// TODO
// TODO
</script>

View File

@ -433,6 +433,6 @@ onMounted(async () => {
warehouseList.value = await WarehouseApi.getWarehouseSimpleList()
accountList.value = await AccountApi.getAccountSimpleList()
})
// TODO
// TODO
// TODO
// TODO
</script>

View File

@ -438,6 +438,6 @@ onMounted(async () => {
warehouseList.value = await WarehouseApi.getWarehouseSimpleList()
accountList.value = await AccountApi.getAccountSimpleList()
})
// TODO
// TODO
// TODO
// TODO
</script>

View File

@ -354,6 +354,6 @@ onMounted(async () => {
warehouseList.value = await WarehouseApi.getWarehouseSimpleList()
userList.value = await UserApi.getSimpleUserList()
})
// TODO
// TODO
// TODO
// TODO
</script>

View File

@ -371,6 +371,6 @@ onMounted(async () => {
supplierList.value = await SupplierApi.getSupplierSimpleList()
userList.value = await UserApi.getSimpleUserList()
})
// TODO
// TODO
// TODO
// TODO
</script>

View File

@ -354,6 +354,6 @@ onMounted(async () => {
warehouseList.value = await WarehouseApi.getWarehouseSimpleList()
userList.value = await UserApi.getSimpleUserList()
})
// TODO
// TODO
// TODO
// TODO
</script>

View File

@ -373,6 +373,6 @@ onMounted(async () => {
customerList.value = await CustomerApi.getCustomerSimpleList()
userList.value = await UserApi.getSimpleUserList()
})
// TODO
// TODO
// TODO
// TODO
</script>

View File

@ -30,7 +30,7 @@
</el-button>
</el-button-group>
</el-form-item>
<!-- TODO @芋艿参考阿里云实时刷新 -->
<!-- TODO @项目组参考阿里云实时刷新 -->
<el-form-item>
<el-switch
size="large"

View File

@ -199,7 +199,7 @@ const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
// TODO
// TODO
/** 关闭按钮操作 */
const handleClose = async (id: number) => {
try {

View File

@ -1,4 +1,4 @@
<!-- TODO 芋艿这块后续抽个独立的组件出来 -->
<!-- TODO 项目组这块后续抽个独立的组件出来 -->
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="60%">
<el-row :gutter="20">

View File

@ -81,7 +81,7 @@
<el-table-column label="描述" align="center" prop="description" />
<el-table-column label="业务编号" align="center" prop="bizId" width="150px" />
<el-table-column label="业务类型" align="center" prop="bizType" width="150px">
<!-- TODO 芋艿此处应创建对应的字典 -->
<!-- TODO 项目组此处应创建对应的字典 -->
<template #default="scope">
<dict-tag :type="DICT_TYPE.MEMBER_EXPERIENCE_BIZ_TYPE" :value="scope.row.bizType" />
</template>

View File

@ -24,7 +24,7 @@
</el-card>
</el-col>
<!-- 下边账户明细 -->
<!-- TODO 芋艿订单管理售后管理收藏记录-->
<!-- TODO 项目组订单管理售后管理收藏记录-->
<el-card header="账户明细" shadow="never" style="width: 100%; margin-top: 20px">
<template #header>
<CardTitle title="账户明细" />

View File

@ -1,7 +1,7 @@
<!--
- Copyright (C) 2018-2019
- All rights reserved, Designed By www.joolun.com
芋道源码
空山团队
移除 avue 组件使用 ElementUI 原生组件
-->
<template>

View File

@ -1,7 +1,7 @@
<!--
- Copyright (C) 2018-2019
- All rights reserved, Designed By www.joolun.com
芋道源码
空山团队
移除暂时用不到的 websocket
代码优化补充注释提升阅读性
-->

View File

@ -2,7 +2,7 @@
- Copyright (C) 2018-2019
- All rights reserved, Designed By www.joolun.com
微信消息 - 图文
芋道源码
空山团队
代码优化补充注释提升阅读性
-->
<template>

View File

@ -1,7 +1,7 @@
<!--
- Copyright (C) 2018-2019
- All rights reserved, Designed By www.joolun.com
芋道源码
空山团队
移除多余的 rep 为前缀的变量 message 消息更简单
代码优化补充注释提升阅读性
优化消息的临时缓存策略发送消息时只清理被发送消息的 tab不会强制切回到 text 输入

View File

@ -2,7 +2,7 @@
- Copyright (C) 2018-2019
- All rights reserved, Designed By www.joolun.com
微信消息 - 视频
芋道源码
空山团队
bug 修复
1joolun 的做法使用 mediaId 从微信公众号下载对应的 mp4 素材从而播放内容
存在的问题mediaId 有效期是 3 超过时间后无法播放

View File

@ -2,7 +2,7 @@
- Copyright (C) 2018-2019
- All rights reserved, Designed By www.joolun.com
微信消息 - 语音
芋道源码
空山团队
bug 修复
1joolun 的做法使用 mediaId 从微信公众号下载对应的 mp4 素材从而播放内容
存在的问题mediaId 有效期是 3 超过时间后无法播放
@ -84,7 +84,7 @@ const amrStop = () => {
playing.value = false
amr.value.stop()
}
// TODO
// TODO
</script>
<style lang="scss" scoped>
.wx-voice-div {

View File

@ -63,7 +63,7 @@ const emit = defineEmits<{
column-count: 5;
margin-top: 10px;
/* 芋道源码:增加 10px避免顶着上面 */
/* 空山团队:增加 10px避免顶着上面 */
}
.waterfall-item {

View File

@ -267,7 +267,7 @@ const menuListToBackend = () => {
}
// menu menu
// TODO: @API
// TODO: @API
const menuToBackend = (menu: any) => {
const result = {
...menu,