feat: unlock all features and update README for LingXi CRM
CRM CI / build (push) Has been cancelled

This commit is contained in:
yi
2026-06-09 15:59:52 +08:00
parent 0e9f2197cd
commit a205a7a49d
17 changed files with 569 additions and 67 deletions
+26
View File
@@ -0,0 +1,26 @@
FROM node:18-alpine AS builder
WORKDIR /app
# Set NPM Registry if needed
# RUN npm config set registry https://registry.npmmirror.com
COPY package*.json ./
RUN npm install
COPY . .
# Set the production API URL
ARG VITE_API_BASE_URL
ENV VITE_API_BASE_URL=${VITE_API_BASE_URL}
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
# COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
+1 -1
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="./src/assets/logo.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ZOCRM</title>
<title>灵犀客户通 (LingXi CRM)</title>
</head>
<body style="background-color: #FAFAFA;padding: 0;margin: 0;">
<div id="app"></div>
+6
View File
@@ -14,6 +14,7 @@ import Product from '../views/Product.vue'
import Config from '../views/Config.vue'
import Subscribe from '../views/Subscribe.vue'
import Result from '../views/Result.vue'
import About from '../views/About.vue'
const routes = [
{
@@ -74,6 +75,11 @@ const routes = [
path: '/result',
name: 'result',
component: Result,
},
{
path: '/about',
name: 'about',
component: About,
}
],
},
+146
View File
@@ -0,0 +1,146 @@
<template>
<div class="about-container">
<a-card :bordered="false" class="about-card">
<div class="about-header">
<img src="../assets/logo.svg" class="about-logo" />
<h1 class="about-title">关于 灵犀客户通</h1>
<p class="about-subtitle">LingXi CRM - 极简高效智能的客户关系管理系统</p>
</div>
<a-divider />
<div class="about-section">
<h2>项目简介</h2>
<p>
灵犀客户通LingXi CRM是一款专为中小企业设计的轻量级客户关系管理系统
系统采用前后端分离架构后端基于高性能的 Go 语言Gin 框架前端使用现代化的 Vue 3 Vite 构建
旨在为企业提供最直观最快捷的客户管理体验
</p>
</div>
<div class="about-section">
<h2>核心功能</h2>
<a-row :gutter="[16, 16]">
<a-col :span="8">
<a-card hoverable size="small" title="客户管理">
全生命周期追踪客户信息建立完善的客户档案
</a-card>
</a-col>
<a-col :span="8">
<a-card hoverable size="small" title="合同管理">
在线管理商务合同实时把控交付与回款进度
</a-card>
</a-col>
<a-col :span="8">
<a-card hoverable size="small" title="产品管理">
统一维护产品库支持多规格管理与库存关联
</a-card>
</a-col>
<a-col :span="8">
<a-card hoverable size="small" title="仪表盘分析">
多维度数据可视化一眼洞察销售业绩与客户增长
</a-card>
</a-col>
<a-col :span="8">
<a-card hoverable size="small" title="角色权限">
精细化的权限控制确保企业数据安全可控
</a-card>
</a-col>
<a-col :span="8">
<a-card hoverable size="small" title="响应式设计">
完美适配多种终端随时随地处理业务需求
</a-card>
</a-col>
</a-row>
</div>
<div class="about-section">
<h2>技术栈</h2>
<a-tag color="blue">Go 1.21</a-tag>
<a-tag color="blue">Gin</a-tag>
<a-tag color="blue">GORM</a-tag>
<a-tag color="green">Vue 3</a-tag>
<a-tag color="green">Vite</a-tag>
<a-tag color="green">Ant Design Vue</a-tag>
<a-tag color="orange">MySQL 8.0</a-tag>
<a-tag color="red">Redis</a-tag>
<a-tag color="cyan">Docker</a-tag>
</div>
<div class="about-footer">
<p>版本信息v1.0.0 Stable</p>
<p> <a href="http://code.xinmi.cloud/" target="_blank">新觅源码库</a> 驱动</p>
</div>
</a-card>
</div>
</template>
<script setup>
</script>
<style scoped>
.about-container {
padding: 24px;
background: #f0f2f5;
min-height: 100%;
}
.about-card {
max-width: 900px;
margin: 0 auto;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
}
.about-header {
text-align: center;
margin-bottom: 32px;
}
.about-logo {
width: 64px;
height: 64px;
margin-bottom: 16px;
filter: drop-shadow(0 4px 8px rgba(71, 111, 255, 0.3));
}
.about-title {
font-size: 28px;
font-weight: 600;
color: #1f1f1f;
margin-bottom: 8px;
}
.about-subtitle {
color: #8c8c8c;
font-size: 16px;
}
.about-section {
margin-bottom: 32px;
}
.about-section h2 {
font-size: 20px;
font-weight: 500;
border-left: 4px solid #476FFF;
padding-left: 12px;
margin-bottom: 16px;
}
.about-section p {
line-height: 1.8;
color: #595959;
}
.about-footer {
text-align: center;
margin-top: 48px;
color: #bfbfbf;
font-size: 14px;
}
.about-footer a {
color: #476FFF;
}
</style>
-11
View File
@@ -107,7 +107,6 @@ import { QuestionCircleTwoTone } from '@ant-design/icons-vue'
import * as echarts from "echarts";
import { reactive, ref, onBeforeMount } from 'vue';
import { getSummary } from "../api/dashboard";
import { getSubscribeInfo } from '../api/subscribe';
import { useRouter } from 'vue-router'
const daysRange = ref(7);
@@ -122,7 +121,6 @@ const data = reactive({
})
onBeforeMount(() => {
subscribeInfo();
initChart();
});
@@ -207,15 +205,6 @@ const initChart = () => {
}
})
}
// 获取用户订阅信息
const subscribeInfo = () => {
getSubscribeInfo().then((res) => {
if (res.data.code == 0 && res.data.data.version == 1) {
router.push('/result')
}
})
}
</script>
<style scoped>
+9 -6
View File
@@ -4,7 +4,7 @@
<div class="logo">
<div><img src="../assets/logo.svg"
style="width: 32px;height: 32px;filter: drop-shadow(2px 2px 6px #79bbff);" /></div>
<div v-if="collapsed == false" class="title"><b>Z</b>O<b style="color: #1283FF;">C</b>RM</div>
<div v-if="collapsed == false" class="title">灵犀客户通</div>
</div>
<a-menu style="border-right: none;width: 149px;" v-model:selectedKeys="selectedKeys" mode="inline">
<a-menu-item :key="item.key" v-for="item in menuItem">
@@ -98,6 +98,9 @@
<component :is="Component" />
</router-view>
</transition>
<div style="text-align: center; padding: 15px; color: #999;">
© 2026 灵犀客户通 | <a href="http://code.xinmi.cloud/" target="_blank">新觅源码库</a>
</div>
</a-layout-content>
</a-layout>
</a-layout>
@@ -110,7 +113,7 @@ import { useStore } from '../store/index';
import { message } from 'ant-design-vue';
import { getUserInfo, getVerifyCode, userDelete } from '../api/user';
import { updateNotice, getNoticeCount, getNoticeList, deleteNotice } from '../api/notice';
import { DashboardOutlined, SmileOutlined, MehOutlined, ShoppingOutlined, ProfileOutlined, CrownOutlined } from '@ant-design/icons-vue';
import { DashboardOutlined, SmileOutlined, MehOutlined, ShoppingOutlined, ProfileOutlined, CrownOutlined, InfoCircleOutlined } from '@ant-design/icons-vue';
import { QuestionCircleFilled, BellFilled, ExclamationCircleOutlined, LogoutOutlined } from '@ant-design/icons-vue';
import moment from 'moment'
@@ -141,10 +144,10 @@ const menuItem = reactive([{
icon: ProfileOutlined,
name: "配置"
}, {
key: "subscribe",
to: "/subscribe",
icon: CrownOutlined,
name: "订阅"
key: "about",
to: "/about",
icon: InfoCircleOutlined,
name: "关于我们"
}])
// 表单校验