正在创建您的专属 ERP 系统,需要几分钟,请稍候...
新一代企业信息化引擎

基于开源ERP
构建您的专属ERP系统

深圳小红点科技为企业提供一站式ERP咨询、部署、定制与托管服务。从中小企业到集团化架构,我们助您快速落地开源ERP,实现业财一体,提升管理效率。

开源灵活 · 云端/私有化 · 全功能覆盖
专业ERP企业信息服务
我们提供从咨询到上线的全生命周期支持,让ERP不再昂贵复杂

ERP实施部署

快速搭建生产级ERP环境,支持AWS、阿里云、私有服务器,提供高可用架构和备份策略,3天即可上线试用环境。

定制化开发

基于开源框架深度定制,满足行业特殊业务流程(制造、零售、服务等),实现个性化报表与工作流。

培训与顾问服务

提供员工培训、业务流程梳理、系统优化咨询,确保ERP系统真正落地并持续产生价值。

托管运维支持

7x24小时监控、自动备份、安全加固,让您专注核心业务,系统稳定无忧。

ERPNext 全功能模块
覆盖企业核心运营,一体化管理销售、采购、库存、财务、人力资源等
会计与财务
销售管理
采购与供应链
库存管理
人力资源管理
制造/生产
客户关系管理(CRM)
项目与任务
电子商务集成
商业智能BI
产品套餐
选择适合您企业的ERP解决方案
为什么选择深圳小红点科技
技术领先 + 深度行业理解 + 敏捷响应

开源透明

基于开源ERPNext,无供应商锁定,源代码完全掌控。

快速上线

标准化实施方案,最快1周部署试运行环境。

高性价比

相比传统ERP节省60%成本,订阅式付费灵活。

本地化支持

深圳本土团队,7x12小时中文技术支持,快速响应。

立即构建您的专属ERP系统

填写下方信息,系统将自动为您创建独立的 ERPNext 站点,几分钟内即可使用。

云端托管,数据隔离,安全可靠

.uogod.com

您的信息将被严格保密,仅用于创建ERP站点

🎉 恭喜!您的ERP系统已创建成功

您的专属 ERPNext 站点已准备就绪,点击下方按钮立即登录开始使用。

登录信息

站点地址:-

管理员账号:-

管理员密码:-

请妥善保存以上信息,密码只会显示一次

立即登录ERP系统
联系我们的ERP专家
随时为您解答ERP相关疑问,获取专业方案

深圳小红点科技有限公司

深圳市龙岗区大运科技园5栋二层

chenzqyl@163.com

0755-89966095 13510318013

官方微信: chenzqyL

售前咨询

可直接邮件或致电,也可通过表单提交需求,我们会第一时间响应。

发送邮件咨询
}, body: JSON.stringify(registerData) }); const result = await response.json(); if (result.status === 'success') { document.getElementById('registerModal').style.display = 'none'; document.getElementById('loginModal').style.display = 'flex'; alert('注册成功,请登录'); } else { alert('注册失败:' + result.message); } } catch (error) { console.error('注册错误:', error); alert('网络错误,请稍后重试'); } }); // 退出登录 function logout() { token = null; userEmail = null; userPhone = null; userRole = null; isAdmin = false; // 新增:更新管理员状态 localStorage.removeItem('token'); localStorage.removeItem('userEmail'); localStorage.removeItem('userPhone'); localStorage.removeItem('userRole'); checkAuthStatus(); // 隐藏所有功能页面,返回首页 document.querySelectorAll('section[id]').forEach(section => { if (section.id !== 'home') { section.style.display = 'none'; } }); document.getElementById('home').scrollIntoView({ behavior: 'smooth', block: 'start' }); alert('已退出登录'); } // 加载仪表盘数据 async function loadDashboard() { try { // 获取站点数量 const sitesResponse = await fetch('/api/sites', { headers: { 'Authorization': 'Bearer ' + token } }); const sitesData = await sitesResponse.json(); if (sitesData.status === 'success') { document.getElementById('activeSitesCount').textContent = sitesData.data.length; } // 获取系统状态 const healthResponse = await fetch('/api/health'); const healthData = await healthResponse.json(); if (healthData.status === 'ok') { document.getElementById('systemStatus').textContent = '正常'; } // 获取最近活动 document.getElementById('activityLog').innerHTML = `

系统启动

${new Date().toLocaleString()}

用户登录

${new Date().toLocaleString()}

`; } catch (error) { console.error('加载仪表盘数据错误:', error); } } // 加载站点列表 async function loadSites() { try { const response = await fetch('/api/sites', { headers: { 'Authorization': 'Bearer ' + token } }); const result = await response.json(); if (result.status === 'success') { const sites = result.data; document.getElementById('sitesCount').textContent = `共 ${sites.length} 个站点`; if (sites.length === 0) { document.getElementById('sitesTableBody').innerHTML = ` 暂无站点,请先创建站点 `; } else { let html = ''; for (const site of sites) { // 获取站点详细信息以获取状态 const siteInfoResponse = await fetch(`/api/sites/info?site=${site}`, { headers: { 'Authorization': 'Bearer ' + token } }); const siteInfoResult = await siteInfoResponse.json(); const status = siteInfoResult.data?.status || 'unknown'; html += ` ${site} ${status === 'running' ? '运行中' : '已停止'} ${new Date().toLocaleDateString()} `; } document.getElementById('sitesTableBody').innerHTML = html; } } } catch (error) { console.error('加载站点列表错误:', error); } } // 启动站点 async function startSite(siteName) { try { const response = await fetch('/api/sites/start', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, body: JSON.stringify({ site: siteName }) }); const result = await response.json(); if (result.status === 'success') { alert('站点启动成功'); loadSites(); // 刷新站点列表 } else { alert('启动站点失败: ' + result.message); } } catch (error) { console.error('启动站点错误:', error); alert('网络错误,请稍后重试'); } } // 停止站点 async function stopSite(siteName) { try { const response = await fetch('/api/sites/stop', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, body: JSON.stringify({ site: siteName }) }); const result = await response.json(); if (result.status === 'success') { alert('站点停止成功'); loadSites(); // 刷新站点列表 } else { alert('停止站点失败: ' + result.message); } } catch (error) { console.error('停止站点错误:', error); alert('网络错误,请稍后重试'); } } // 重启站点 async function restartSite(siteName) { try { const response = await fetch('/api/sites/restart', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, body: JSON.stringify({ site: siteName }) }); const result = await response.json(); if (result.status === 'success') { alert('站点重启成功'); loadSites(); // 刷新站点列表 } else { alert('重启站点失败: ' + result.message); } } catch (error) { console.error('重启站点错误:', error); alert('网络错误,请稍后重试'); } } // 备份站点 async function backupSite(siteName) { try { const response = await fetch('/api/sites/backup', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, body: JSON.stringify({ site: siteName }) }); const result = await response.json(); if (result.status === 'success') { alert('站点备份成功'); } else { alert('备份站点失败: ' + result.message); } } catch (error) { console.error('备份站点错误:', error); alert('网络错误,请稍后重试'); } } // 加载账单管理数据 async function loadBilling() { try { // 显示/隐藏管理员筛选表单 const filterForm = document.getElementById('invoiceFilterForm'); const userEmailHeader = document.getElementById('userEmailHeader'); if (isAdmin && filterForm && userEmailHeader) { filterForm.style.display = 'block'; userEmailHeader.style.display = 'table-cell'; } else if (filterForm && userEmailHeader) { filterForm.style.display = 'none'; userEmailHeader.style.display = 'none'; } // 获取套餐列表 const plansResponse = await fetch('/api/billing/plans'); const plansData = await plansResponse.json(); if (plansData.status === 'success') { const plans = plansData.data; let plansHtml = ''; Object.entries(plans).forEach(([planId, plan]) => { plansHtml += `

${plan.name}

¥${plan.price}/月

`; }); document.getElementById('plansList').innerHTML = plansHtml; } // 获取订阅列表 // 构建请求数据,根据用户标识选择发送email还是phone const subscriptionsRequestData = {}; if (userEmail) { subscriptionsRequestData.user_email = userEmail; } else if (userPhone) { subscriptionsRequestData.user_phone = userPhone; } const subscriptionsResponse = await fetch('/api/billing/subscriptions', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, body: JSON.stringify(subscriptionsRequestData) }); const subscriptionsData = await subscriptionsResponse.json(); if (subscriptionsData.status === 'success') { const subscriptions = subscriptionsData.data; if (subscriptions.length === 0) { document.getElementById('subscriptionsTableBody').innerHTML = ` 暂无订阅记录 `; } else { let subscriptionsHtml = ''; subscriptions.forEach(sub => { const planName = plans[sub.plan_id]?.name || sub.plan_id; subscriptionsHtml += ` ${sub.id} ${planName} ${new Date(sub.start_date).toLocaleDateString()} ${new Date(sub.end_date).toLocaleDateString()} ${sub.status === 'active' ? '活跃' : '已取消'} ${sub.status === 'active' ? `` : ''} `; }); document.getElementById('subscriptionsTableBody').innerHTML = subscriptionsHtml; } } // 获取账单记录 let invoicesResponse, invoicesData; if (isAdmin) { // 管理员获取所有账单 const userEmailFilter = document.getElementById('userEmailFilter')?.value || ''; const startDateFilter = document.getElementById('startDateFilter')?.value || ''; const endDateFilter = document.getElementById('endDateFilter')?.value || ''; let url = '/api/admin/invoices'; const params = new URLSearchParams(); if (userEmailFilter) params.append('user_email', userEmailFilter); if (startDateFilter) params.append('start_date', startDateFilter); if (endDateFilter) params.append('end_date', endDateFilter); if (params.toString()) url += '?' + params.toString(); invoicesResponse = await fetch(url, { headers: { 'Authorization': 'Bearer ' + token } }); } else { // 普通用户获取自己的账单 // 构建请求数据,根据用户标识选择发送email还是phone const invoicesRequestData = {}; if (userEmail) { invoicesRequestData.user_email = userEmail; } else if (userPhone) { invoicesRequestData.user_phone = userPhone; } invoicesResponse = await fetch('/api/billing/invoices', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, body: JSON.stringify(invoicesRequestData) }); } invoicesData = await invoicesResponse.json(); if (invoicesData.status === 'success') { const invoices = invoicesData.data; if (invoices.length === 0) { document.getElementById('invoicesTableBody').innerHTML = ` 暂无账单记录 `; } else { let invoicesHtml = ''; invoices.forEach(invoice => { invoicesHtml += ` ${isAdmin ? `${invoice.user_email}` : ''} ${invoice.id} ¥${invoice.amount} ${new Date(invoice.issued_date || invoice.issue_date).toLocaleDateString()} ${invoice.status === 'paid' ? '已支付' : '未支付'} `; }); document.getElementById('invoicesTableBody').innerHTML = invoicesHtml; } } } catch (error) { console.error('加载账单管理数据错误:', error); } } // 订阅套餐 async function subscribeToPlan(planId) { try { // 构建请求数据,根据用户标识选择发送email还是phone const requestData = { plan_id: planId, billing_cycle: 'monthly' }; if (userEmail) { requestData.user_email = userEmail; } else if (userPhone) { requestData.user_phone = userPhone; } const response = await fetch('/api/billing/subscription', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, body: JSON.stringify(requestData) }); const result = await response.json(); if (result.status === 'success') { alert('订阅成功'); loadBilling(); } else { alert('订阅失败:' + result.message); } } catch (error) { console.error('订阅错误:', error); alert('网络错误,请稍后重试'); } } // 取消订阅 async function cancelSubscription(subscriptionId) { if (confirm('确定要取消订阅吗?')) { try { const response = await fetch('/api/billing/cancel', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, body: JSON.stringify({ subscription_id: subscriptionId }) }); const result = await response.json(); if (result.status === 'success') { alert('取消订阅成功'); loadBilling(); } else { alert('取消订阅失败:' + result.message); } } catch (error) { console.error('取消订阅错误:', error); alert('网络错误,请稍后重试'); } } } // 加载系统监控数据 async function loadMonitoring() { try { // 获取系统指标 const metricsResponse = await fetch('/api/monitoring/metrics', { headers: { 'Authorization': 'Bearer ' + token } }); const metricsData = await metricsResponse.json(); if (metricsData.status === 'success') { const metrics = metricsData.data; document.getElementById('cpuUsage').textContent = `${metrics.cpu_usage}%`; document.getElementById('memoryUsage').textContent = `${metrics.memory_usage}%`; document.getElementById('diskUsage').textContent = `${metrics.disk_usage}%`; // 计算运行时间 const uptimeDays = Math.floor(metrics.uptime / (24 * 60 * 60)); document.getElementById('uptime').textContent = `${uptimeDays}天`; } // 获取请求日志 const logsResponse = await fetch('/api/monitoring/logs', { headers: { 'Authorization': 'Bearer ' + token } }); const logsData = await logsResponse.json(); if (logsData.status === 'success') { const logs = logsData.data; if (logs.length === 0) { document.getElementById('logsList').innerHTML = `

暂无日志记录

`; } else { let logsHtml = ''; logs.forEach(log => { logsHtml += `

${log.endpoint}

${new Date(log.timestamp).toLocaleString()}

${log.status_code}
`; }); document.getElementById('logsList').innerHTML = logsHtml; } } } catch (error) { console.error('加载系统监控数据错误:', error); } } // 加载运营管理仪表盘数据 async function loadAdminDashboard() { try { // 获取系统概览数据 const overviewResponse = await fetch('/api/admin/overview', { headers: { 'Authorization': 'Bearer ' + token } }); const overviewData = await overviewResponse.json(); if (overviewData.status === 'success') { const data = overviewData.data; document.getElementById('totalUsers').textContent = data.total_users; document.getElementById('totalSites').textContent = data.total_sites; document.getElementById('totalRevenue').textContent = `¥${data.total_revenue}`; document.getElementById('activeSubscriptions').textContent = data.active_subscriptions; } // 获取最近活动 const activityResponse = await fetch('/api/admin/activity', { headers: { 'Authorization': 'Bearer ' + token } }); const activityData = await activityResponse.json(); if (activityData.status === 'success') { const activities = activityData.data; if (activities.length === 0) { document.getElementById('adminActivityLogs').innerHTML = `

暂无活动记录

`; } else { let activityHtml = ''; activities.forEach(activity => { activityHtml += `

${activity.action}

${activity.user} · ${new Date(activity.timestamp).toLocaleString()}

`; }); document.getElementById('adminActivityLogs').innerHTML = activityHtml; } } } catch (error) { console.error('加载运营管理仪表盘数据错误:', error); } } // 加载产品管理数据 async function loadProductManagement() { if (userRole !== 'admin') return; try { const response = await fetch('/api/products', { headers: { 'Authorization': 'Bearer ' + token } }); const data = await response.json(); if (data.status === 'success' && data.data) { const products = data.data; if (products.length === 0) { document.getElementById('adminProductList').innerHTML = ` 暂无产品`; } else { let productHtml = ''; products.forEach(product => { productHtml += ` ${product.name} ${product.description || '-'} ¥${product.price} ${product.period || '月'} ${product.status === 'active' ? '启用' : '停用'} `; }); document.getElementById('adminProductList').innerHTML = productHtml; } } } catch (error) { console.error('加载产品管理数据错误:', error); } } // 显示添加/编辑产品弹窗 let editingProductId = null; function showProductModal(product = null) { editingProductId = product ? product.id : null; document.getElementById('productModalTitle').textContent = product ? '编辑产品' : '添加产品'; document.getElementById('productName').value = product ? product.name : ''; document.getElementById('productDescription').value = product ? product.description : ''; document.getElementById('productPrice').value = product ? product.price : ''; document.getElementById('productPeriod').value = product ? product.period : 'month'; document.getElementById('productFeatures').value = product ? product.features : ''; document.getElementById('productStatus').value = product ? product.status : 'active'; document.getElementById('productModal').style.display = 'flex'; } function closeProductModal() { document.getElementById('productModal').style.display = 'none'; editingProductId = null; } async function saveProduct() { const name = document.getElementById('productName').value.trim(); const description = document.getElementById('productDescription').value.trim(); const price = document.getElementById('productPrice').value.trim(); const period = document.getElementById('productPeriod').value; const features = document.getElementById('productFeatures').value.trim(); const status = document.getElementById('productStatus').value; if (!name || !price) { alert('请填写必填字段'); return; } try { const url = editingProductId ? '/api/products' : '/api/products'; const method = editingProductId ? 'PUT' : 'POST'; const response = await fetch(url, { method: method, headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, body: JSON.stringify({ id: editingProductId, name, description, price: parseFloat(price), period, features, status }) }); const result = await response.json(); if (result.status === 'success') { alert(editingProductId ? '产品更新成功' : '产品添加成功'); closeProductModal(); loadProductManagement(); } else { alert('操作失败: ' + result.message); } } catch (error) { console.error('保存产品错误:', error); alert('网络错误,请稍后重试'); } } async function editProduct(productId) { try { const response = await fetch('/api/products/details?id=' + productId, { headers: { 'Authorization': 'Bearer ' + token } }); const result = await response.json(); if (result.status === 'success' && result.data) { showProductModal(result.data); } } catch (error) { console.error('获取产品详情错误:', error); } } async function deleteProduct(productId) { if (!confirm('确定要删除这个产品吗?')) return; try { const response = await fetch('/api/products?id=' + productId, { method: 'DELETE', headers: { 'Authorization': 'Bearer ' + token } }); const result = await response.json(); if (result.status === 'success') { alert('产品删除成功'); loadProductManagement(); } else { alert('删除失败: ' + result.message); } } catch (error) { console.error('删除产品错误:', error); alert('网络错误,请稍后重试'); } } // 加载用户管理数据 async function loadUserManagement() { try { const response = await fetch('/api/admin/users', { headers: { 'Authorization': 'Bearer ' + token } }); const userData = await response.json(); if (userData.status === 'success') { const users = userData.data; if (users.length === 0) { document.getElementById('userList').innerHTML = ` 暂无用户记录 `; } else { let userHtml = ''; users.forEach(user => { userHtml += ` ${user.full_name} ${user.phone} ${user.email || '-'} ${user.company} ${user.role === 'admin' ? '运营管理者' : '普通用户'} ${new Date(user.created_at).toLocaleDateString()} `; }); document.getElementById('userList').innerHTML = userHtml; } } } catch (error) { console.error('加载用户管理数据错误:', error); } } // 加载所有站点管理数据 async function loadAdminSites() { try { const response = await fetch('/api/admin/sites', { headers: { 'Authorization': 'Bearer ' + token } }); const siteData = await response.json(); if (siteData.status === 'success') { const sites = siteData.data; if (sites.length === 0) { document.getElementById('adminSiteList').innerHTML = ` 暂无站点记录 `; } else { let siteHtml = ''; sites.forEach(site => { siteHtml += ` ${site.name} ${site.domain} ${site.user_email} 运行中 ${new Date(site.created_at).toLocaleDateString()} `; }); document.getElementById('adminSiteList').innerHTML = siteHtml; } } } catch (error) { console.error('加载所有站点管理数据错误:', error); } } // 刷新站点列表 document.getElementById('refreshSitesBtn').addEventListener('click', loadSites); // 表单提交处理 const form = document.getElementById('deployForm'); const loadingOverlay = document.getElementById('loadingOverlay'); const deploySection = document.getElementById('deploySection'); const resultSection = document.getElementById('resultSection'); form.addEventListener('submit', async (e) => { e.preventDefault(); const fullName = document.getElementById('fullName').value.trim(); const companyName = document.getElementById('companyName').value.trim(); const email = document.getElementById('email').value.trim(); const phone = document.getElementById('phone').value.trim(); const deployType = document.getElementById('deployType').value; const message = document.getElementById('message').value.trim(); const siteName = document.getElementById('siteName').value.trim(); const faWeixin = document.getElementById('fa-weixin').value.trim(); // 验证 if (!fullName || !companyName || !email) { alert('请填写姓名、公司名称和企业邮箱'); return; } if (!email.includes('@')) { alert('请输入有效的邮箱地址'); return; } if (!phone) { alert('请输入联系电话'); return; } if (!siteName) { alert('请输入站点名称'); return; } if (!faWeixin) { alert('请输入微信'); return; } const submitBtn = document.getElementById('submitDeployBtn'); submitBtn.disabled = true; submitBtn.innerHTML = ' 根据网络情况可能需要几分钟或更长时间,正在创建中...'; // 显示加载动画 loadingOverlay.classList.add('show'); try { // 调用创建站点 API const response = await fetch('/api/create_site', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ fullName: fullName, companyName: companyName, phone: phone, siteName: siteName, faWeixin: faWeixin, deployType: deployType, message: message, email: email, password: Math.random().toString(36).slice(-8) // 生成随机密码 }) }); const result = await response.json(); if (result.success) { // 保存登录信息 loginInfo = { site_url: `https://${result.siteName}`, admin_email: 'Administrator', login_url: `https://${result.siteName}`, admin_password: result.adminPassword }; // 显示结果 document.getElementById('resultSiteUrl').textContent = `https://${result.siteName}`; document.getElementById('resultAdminEmail').textContent = 'Administrator'; document.getElementById('resultAdminPassword').textContent = loginInfo.admin_password; document.getElementById('loginBtn').href = `https://${result.siteName}`; document.getElementById('fa-weixin').textContent = faWeixin; document.getElementById('deployType').textContent = deployType; document.getElementById('message').textContent = message; document.getElementById('siteName').textContent = siteName; document.getElementById('phone').textContent = phone; document.getElementById('email').textContent = email; document.getElementById('companyName').textContent = companyName; document.getElementById('fullName').textContent = fullName; // 隐藏表单,显示结果 deploySection.style.display = 'none'; resultSection.classList.add('show'); // 滚动到结果区域 resultSection.scrollIntoView({ behavior: 'smooth', block: 'center' }); } else { alert('创建失败:' + result.error); } } catch (error) { console.error('请求错误:', error); alert('网络错误,请稍后重试'); } finally { loadingOverlay.classList.remove('show'); submitBtn.disabled = false; submitBtn.innerHTML = ' 立即创建我的ERP系统'; } }); // 复制登录信息 function copyLoginInfo() { const text = `ERP站点地址:${loginInfo.site_url}\n管理员账号:${loginInfo.admin_email}\n管理员密码:${loginInfo.admin_password}\n登录地址:${loginInfo.login_url}`; navigator.clipboard.writeText(text).then(() => { alert('登录信息已复制到剪贴板'); }).catch(() => { // 降级方案 const textarea = document.createElement('textarea'); textarea.value = text; document.body.appendChild(textarea); textarea.select(); document.execCommand('copy'); document.body.removeChild(textarea); alert('登录信息已复制到剪贴板'); }); } // 导航栏滚动效果 window.addEventListener('scroll', () => { const nav = document.querySelector('.navbar'); if(window.scrollY > 10){ nav.style.boxShadow = '0 4px 12px rgba(0,0,0,0.05)'; } else { nav.style.boxShadow = '0 1px 3px rgba(0,0,0,0.05)'; } });