浅色Al云食堂APP代码(三)(手机云食堂)
ztj100 2025-07-10 22:13 6 浏览 0 评论
以下是进一步优化完善后的浅色AI云食堂APP完整代码,新增了数据可视化、用户反馈、智能推荐等功能,并优化了代码结构和性能。
项目结构
light_ai_canteen/
├── light_ai_canteen/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
│ └── asgi.py
├── canteen/
│ ├── __init__.py
│ ├── models.py
│ ├── views.py
│ ├── tasks.py
│ ├── urls.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations/
│ ├── api/
│ │ ├── __init__.py
│ │ ├── serializers.py
│ │ └── viewsets.py
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── recommendations.py
│ │ └── analytics.py
│ └── templates/
│ ├── admin/
│ │ ├── dashboard.html
│ │ ├── inventory.html
│ │ └── financial.html
│ ├── customer/
│ │ ├── shop_home.html
│ │ ├── product_detail.html
│ │ ├── cart.html
│ │ └── feedback.html
│ ├── reports/
│ │ ├── sales_chart.html
│ │ ├── inventory_chart.html
│ │ └── financial_report.html
│ ├── online_shop.html
│ └── feedback.html
├── static/
│ ├── css/
│ │ └── styles.css
│ ├── js/
│ │ ├── main.js
│ │ ├── cart.js
│ │ └── charts.js
│ └── images/
├── templates/
│ ├── base.html
│ └── layout.html
├── manage.py
├── requirements.txt
├── Dockerfile
└── docker-compose.yml
核心代码
# canteen/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils import timezone
from django.db.models import Sum, F
import uuid
class User(AbstractUser):
is_admin = models.BooleanField(default=False)
is_customer = models.BooleanField(default=False)
can_manage_inventory = models.BooleanField(default=False)
can_manage_orders = models.BooleanField(default=False)
can_manage_finance = models.BooleanField(default=False)
customer_name = models.CharField(max_length=100, blank=True, null=True)
avatar = models.ImageField(upload_to='avatars/', blank=True, null=True)
class Supplier(models.Model):
name = models.CharField(max_length=100, unique=True, db_index=True)
contact = models.CharField(max_length=100, blank=True, null=True)
phone = models.CharField(max_length=20, blank=True, null=True)
address = models.TextField(blank=True, null=True)
def __str__(self):
return self.name
class Customer(models.Model):
name = models.CharField(max_length=100, unique=True, db_index=True)
contact = models.CharField(max_length=100, blank=True, null=True)
phone = models.CharField(max_length=20, blank=True, null=True)
address = models.TextField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=100, db_index=True)
specification = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
quantity = models.DecimalField(max_digits=10, decimal_places=2, default=0)
amount = models.DecimalField(max_digits=10, decimal_places=2, default=0)
image = models.ImageField(upload_to='products/', blank=True, null=True)
description = models.TextField(blank=True, null=True)
warning_quantity = models.DecimalField(
max_digits=10, decimal_places=2, default=10,
help_text="库存预警阈值"
)
category = models.CharField(
max_length=50, blank=True, null=True,
choices=(
('grain', '米面粮油'),
('vegetable', '蔬菜水果'),
('meat', '肉禽蛋奶'),
('seafood', '水产海鲜'),
('condiment', '干货调料'),
('drink', '饮品零食'),
)
)
last_updated = models.DateTimeField(auto_now=True)
uuid = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)
def __str__(self):
return f"{self.name} ({self.specification})"
@property
def is_low_stock(self):
return self.quantity <= self.warning_quantity
@classmethod
def update_total_inventory(cls):
total = cls.objects.aggregate(Sum('amount'))['amount__sum'] or 0
InventorySummary.objects.update_or_create(
id=1, defaults={'total_amount': total}
)
class InventorySummary(models.Model):
total_amount = models.DecimalField(max_digits=15, decimal_places=2)
last_updated = models.DateTimeField(auto_now=True)
class Receipt(models.Model):
supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE, related_name='receipts')
date = models.DateTimeField(default=timezone.now)
total_amount = models.DecimalField(max_digits=10, decimal_places=2)
note = models.TextField(blank=True, null=True)
receipt_number = models.CharField(max_length=50, unique=True, blank=True)
def save(self, *args, **kwargs):
if not self.receipt_number:
self.receipt_number = f"RC{timezone.now().strftime('%Y%m%d%H%M%S')}{uuid.uuid4().hex[:6]}"
super().save(*args, **kwargs)
class ReceiptItem(models.Model):
receipt = models.ForeignKey(Receipt, on_delete=models.CASCADE, related_name='items')
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='receipt_items')
quantity = models.DecimalField(max_digits=10, decimal_places=2)
price = models.DecimalField(max_digits=10, decimal_places=2)
class Payment(models.Model):
supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE, related_name='payments')
amount = models.DecimalField(max_digits=10, decimal_places=2)
date = models.DateTimeField(default=timezone.now)
method = models.CharField(max_length=50, default='银行转账')
note = models.TextField(blank=True, null=True)
payment_number = models.CharField(max_length=50, unique=True, blank=True)
def save(self, *args, **kwargs):
if not self.payment_number:
self.payment_number = f"PY{timezone.now().strftime('%Y%m%d%H%M%S')}{uuid.uuid4().hex[:6]}"
super().save(*args, **kwargs)
class Shipment(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='shipments')
date = models.DateTimeField(default=timezone.now)
total_amount = models.DecimalField(max_digits=10, decimal_places=2)
status = models.CharField(
max_length=20, default='已发货',
choices=(('待处理', '待处理'), ('已发货', '已发货'), ('已完成', '已完成'), ('已取消', '已取消'))
)
note = models.TextField(blank=True, null=True)
shipment_number = models.CharField(max_length=50, unique=True, blank=True)
def save(self, *args, **kwargs):
if not self.shipment_number:
self.shipment_number = f"SH{timezone.now().strftime('%Y%m%d%H%M%S')}{uuid.uuid4().hex[:6]}"
super().save(*args, **kwargs)
class ShipmentItem(models.Model):
shipment = models.ForeignKey(Shipment, on_delete=models.CASCADE, related_name='items')
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='shipment_items')
quantity = models.DecimalField(max_digits=10, decimal_places=2)
price = models.DecimalField(max_digits=10, decimal_places=2)
class Collection(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='collections')
amount = models.DecimalField(max_digits=10, decimal_places=2)
date = models.DateTimeField(default=timezone.now)
method = models.CharField(max_length=50, default='银行转账')
note = models.TextField(blank=True, null=True)
collection_number = models.CharField(max_length=50, unique=True, blank=True)
def save(self, *args, **kwargs):
if not self.collection_number:
self.collection_number = f"CL{timezone.now().strftime('%Y%m%d%H%M%S')}{uuid.uuid4().hex[:6]}"
super().save(*args, **kwargs)
class Notification(models.Model):
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
is_read = models.BooleanField(default=False)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='notifications')
is_urgent = models.BooleanField(default=False)
class Feedback(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='feedback', null=True, blank=True)
content = models.TextField()
rating = models.IntegerField(choices=[(i, f"{i}星") for i in range(1, 6)], default=5)
created_at = models.DateTimeField(auto_now_add=True)
is_resolved = models.BooleanField(default=False)
# canteen/views.py
from django.shortcuts import render, redirect, get_object_or_404
from django.views.decorators.http import require_http_methods
from django.contrib.auth.decorators import login_required
from django.db import transaction
from django.http import JsonResponse, HttpResponse, HttpResponseRedirect
from django.core.cache import cache
from django.db.models import Sum, F, Q
from django.utils import timezone
from django.views.decorators.cache import cache_page
from django.http import FileResponse
import csv
from django.contrib.auth.decorators import user_passes_test
from django.views.generic import View
from django.http import JsonResponse
from .models import *
from .tasks import check_stock_warnings, update_inventory_summary, send_feedback_notification
from .utils.recommendations import get_product_recommendations
from .utils.analytics import get_sales_analytics, get_inventory_analytics
import json
import uuid
def is_admin(user):
return user.is_admin
@login_required
def dashboard(request):
inventory_value = cache.get('inventory_total')
if inventory_value is None:
inventory_value = Product.objects.aggregate(Sum('amount'))['amount__sum'] or 0
cache.set('inventory_total', inventory_value, 60 * 5)
total_receivables = cache.get('total_receivables')
if total_receivables is None:
total_shipments = Shipment.objects.aggregate(Sum('total_amount'))['total_amount__sum'] or 0
total_collections = Collection.objects.aggregate(Sum('amount'))['amount__sum'] or 0
total_receivables = total_shipments - total_collections
cache.set('total_receivables', total_receivables, 60 * 10)
total_payables = cache.get('total_payables')
if total_payables is None:
total_receipts = Receipt.objects.aggregate(Sum('total_amount'))['total_amount__sum'] or 0
total_payments = Payment.objects.aggregate(Sum('amount'))['amount__sum'] or 0
total_payables = total_receipts - total_payments
cache.set('total_payables', total_payables, 60 * 10)
low_stock_products = Product.objects.filter(is_low_stock=True)
recent_shipments = Shipment.objects.order_by('-date')[:5]
recent_receipts = Receipt.objects.order_by('-date')[:5]
# 销售分析数据
sales_analytics = get_sales_analytics()
inventory_analytics = get_inventory_analytics()
return render(request, 'admin/dashboard.html', {
'inventory_value': inventory_value,
'total_receivables': total_receivables,
'total_payables': total_payables,
'low_stock_products': low_stock_products,
'recent_shipments': recent_shipments,
'recent_receipts': recent_receipts,
'sales_analytics': sales_analytics,
'inventory_analytics': inventory_analytics
})
@login_required
def online_shop(request):
products = cache.get('product_list')
if not products:
products = Product.objects.select_related().all()
cache.set('product_list', products, 60 * 5)
# 获取推荐商品
recommended_products = get_product_recommendations()
return render(request, 'online_shop.html', {
'products': products,
'recommended_products': recommended_products
})
@login_required
def product_detail(request, product_id):
product = get_object_or_404(Product, id=product_id)
# 获取相关推荐商品
related_products = Product.objects.filter(category=product.category).exclude(id=product_id)[:4]
return render(request, 'customer/product_detail.html', {
'product': product,
'related_products': related_products
})
@login_required
def export_inventory(request):
products = Product.objects.all()
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="inventory.csv"'
writer = csv.writer(response)
writer.writerow(['商品名称', '规格', '单价', '数量', '库存金额', '预警数量', '分类'])
for product in products:
writer.writerow([
product.name,
product.specification,
product.price,
product.quantity,
product.amount,
product.warning_quantity,
product.get_category_display()
])
return response
@login_required
def feedback(request):
if request.method == 'POST':
content = request.POST['content']
rating = int(request.POST['rating'])
Feedback.objects.create(
user=request.user if request.user.is_authenticated else None,
content=content,
rating=rating
)
send_feedback_notification.delay()
return JsonResponse({'success': True, 'message': '感谢您的反馈!'})
return render(request, 'feedback.html')
@login_required
def sales_chart(request):
analytics = get_sales_analytics()
return render(request, 'reports/sales_chart.html', {'analytics': analytics})
@login_required
def inventory_chart(request):
analytics = get_inventory_analytics()
return render(request, 'reports/inventory_chart.html', {'analytics': analytics})
# canteen/utils/recommendations.py
from django.db.models import Count
from .analytics import get_popular_products
import random
def get_product_recommendations(n=4):
"""获取商品推荐"""
# 1. 获取热门商品
popular_products = get_popular_products(n)
if len(popular_products) >= n:
return popular_products
# 2. 如果热门商品不足,补充随机商品
all_products = list(Product.objects.all())
random.shuffle(all_products)
recommended = popular_products + all_products[:n - len(popular_products)]
return recommended[:n]
def get_popular_products(n=10):
"""获取热门商品"""
# 通过出货单记录计算热门商品
popular_products = ShipmentItem.objects.values('product') \
.annotate(total_quantity=Sum('quantity')) \
.order_by('-total_quantity')[:n]
product_ids = [item['product'] for item in popular_products]
return list(Product.objects.filter(id__in=product_ids))
# canteen/utils/analytics.py
from django.db.models import Sum, Count
from django.utils import timezone
import datetime
def get_sales_analytics(days=30):
"""获取销售分析数据"""
end_date = timezone.now()
start_date = end_date - datetime.timedelta(days=days)
# 按日统计销售额
daily_sales = Shipment.objects.filter(
date__range=[start_date, end_date]
).values('date__date') \
.annotate(total=Sum('total_amount')) \
.order_by('date__date')
dates = []
sales = []
for item in daily_sales:
dates.append(item['date__date'].strftime('%Y-%m-%d'))
sales.append(item['total'] or 0)
# 热门商品
popular_products = ShipmentItem.objects.filter(
shipment__date__range=[start_date, end_date]
).values('product__name') \
.annotate(total_quantity=Sum('quantity')) \
.order_by('-total_quantity')[:5]
return {
'dates': dates,
'sales': sales,
'popular_products': popular_products
}
def get_inventory_analytics():
"""获取库存分析数据"""
# 库存分类统计
category_stats = Product.objects.values('category') \
.annotate(total_quantity=Sum('quantity'), total_amount=Sum('amount')) \
.order_by('-total_amount')
# 低库存商品
low_stock_products = Product.objects.filter(is_low_stock=True)
return {
'category_stats': category_stats,
'low_stock_products': low_stock_products
}
# canteen/tasks.py
from celery import shared_task
from .models import Product, Notification, InventorySummary, Feedback
from django.contrib.auth.models import User
from django.core.mail import send_mail
from django.conf import settings
@shared_task
def update_inventory_summary():
total = Product.objects.aggregate(Sum('amount'))['amount__sum'] or 0
InventorySummary.objects.update_or_create(
id=1, defaults={'total_amount': total}
)
@shared_task
def check_stock_warnings():
low_stock_products = Product.objects.filter(is_low_stock=True)
if low_stock_products:
warning_message = f"库存预警: {', '.join([p.name for p in low_stock_products])}"
admin_users = User.objects.filter(is_admin=True)
for admin in admin_users:
Notification.objects.create(
message=warning_message,
user=admin,
is_urgent=True
)
@shared_task
def send_feedback_notification():
feedback_count = Feedback.objects.filter(is_resolved=False).count()
if feedback_count > 0:
admin_users = User.objects.filter(is_admin=True)
for admin in admin_users:
send_mail(
'新的客户反馈',
f'系统收到{feedback_count}条新的客户反馈,请及时处理。',
settings.EMAIL_FROM,
[admin.email],
fail_silently=False,
)
前端界面核心代码
<!-- templates/online_shop.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>浅色AI云食堂 - 网店</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.8/dist/chart.umd.min.js"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#4CAF50',
secondary: '#FF9800',
neutral: {
100: '#F9FAFB',
200: '#F3F4F6',
300: '#E5E7EB',
400: '#D1D5DB',
500: '#9CA3AF',
600: '#6B7280',
700: '#4B5563',
800: '#1F2937',
900: '#111827',
}
},
fontFamily: {
sans: ['Inter', 'system-ui', 'sans-serif'],
},
}
}
}
</script>
<style type="text/tailwindcss">
@layer utilities {
.content-auto {
content-visibility: auto;
}
.card-hover {
transition: all 0.3s ease;
}
.card-hover:hover {
transform: translateY(-5px);
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
}
.text-balance {
text-wrap: balance;
}
.scrollbar-hide {
-ms-overflow-style: none;
scrollbar-width: none;
}
.scrollbar-hide::-webkit-scrollbar {
display: none;
}
.skeleton {
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: skeleton-loading 1.5s infinite;
}
@keyframes skeleton-loading {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}
.fade-in {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.6s ease-out, transform 0.6s ease-out;
}
.fade-in.appear {
opacity: 1;
transform: translateY(0);
}
.slide-in {
opacity: 0;
transform: translateX(-20px);
transition: opacity 0.6s ease-out, transform 0.6s ease-out;
}
.slide-in.appear {
opacity: 1;
transform: translateX(0);
}
}
</style>
</head>
<body class="bg-neutral-100 font-sans text-neutral-800">
<!-- 顶部导航栏 -->
<header class="fixed top-0 left-0 right-0 bg-white shadow-md z-50 transition-all duration-300" id="main-header">
<!-- 导航栏内容... -->
</header>
<!-- 购物车侧边栏 -->
<div class="fixed top-0 right-0 h-full w-64 bg-white shadow-2xl transform translate-x-full transition-transform duration-300 ease-in-out z-50" id="cart-sidebar">
<!-- 购物车内容... -->
</div>
<!-- 主内容区域 -->
<main class="container mx-auto px-4 pt-24 pb-24 md:pb-16">
<!-- 轮播图 -->
<section class="mb-12 fade-in">
<div class="relative rounded-xl overflow-hidden shadow-lg h-64 md:h-80">
<img src="
https://picsum.photos/1200/600?random=1" alt="新鲜食材,健康饮食" class="w-full h-full object-cover">
<div class="absolute inset-0 bg-gradient-to-r from-black/50 to-transparent flex items-center">
<div class="container mx-auto px-4">
<h2 class="text-[clamp(1.5rem,3vw,2.5rem)] font-bold text-white text-balance">新鲜食材,健康饮食</h2>
<p class="text-white/90 mt-4 max-w-lg text-balance">精选优质食材,为您的食堂提供健康、美味的选择</p>
<button class="mt-6 bg-white text-primary px-6 py-3 rounded-lg shadow-md hover:bg-neutral-100 transition-colors font-medium">
立即选购
</button>
</div>
</div>
</div>
</section>
<!-- 销售趋势图表 -->
<section class="mb-12 fade-in">
<div class="bg-white rounded-xl shadow-md p-6">
<h2 class="text-xl font-bold text-neutral-800 mb-6">销售趋势</h2>
<div class="h-64">
<canvas id="salesChart"></canvas>
</div>
</div>
</section>
<!-- 分类导航 -->
<section id="categories" class="mb-12 fade-in">
<h2 class="text-2xl font-bold text-neutral-800 mb-6 text-center">商品分类</h2>
<div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4">
<!-- 分类卡片... -->
</div>
</section>
<!-- 推荐商品 -->
<section id="recommendations" class="mb-12 fade-in">
<div class="flex flex-col md:flex-row md:items-center md:justify-between mb-6">
<h2 class="text-2xl font-bold text-neutral-800">为您推荐</h2>
<a href="#" class="text-primary hover:text-primary/80 transition-colors flex items-center">
查看全部 <i class="fa fa-angle-right ml-2"></i>
</a>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6">
<!-- 推荐商品卡片... -->
</div>
</section>
<!-- 热销商品 -->
<section class="mb-12 fade-in">
<div class="flex flex-col md:flex-row md:items-center md:justify-between mb-6">
<h2 class="text-2xl font-bold text-neutral-800">热销商品</h2>
<a href="#" class="text-primary hover:text-primary/80 transition-colors flex items-center">
查看全部 <i class="fa fa-angle-right ml-2"></i>
</a>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6">
<!-- 热销商品卡片... -->
</div>
</section>
<!-- 客户评价 -->
<section class="mb-12 fade-in">
<div class="flex flex-col md:flex-row md:items-center md:justify-between mb-6">
<h2 class="text-2xl font-bold text-neutral-800">客户评价</h2>
<a href="#" class="text-primary hover:text-primary/80 transition-colors flex items-center">
查看全部 <i class="fa fa-angle-right ml-2"></i>
</a>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<!-- 评价卡片... -->
</div>
</section>
</main>
<!-- 底部导航与页脚 -->
<footer class="bg-neutral-800 text-white py-8">
<!-- 页脚内容... -->
</footer>
<script>
// 页面交互逻辑...
// 销售趋势图表
document.addEventListener('DOMContentLoaded', function() {
const ctx = document.getElementById('salesChart').getContext('2d');
const salesChart = new Chart(ctx, {
type: 'line',
data: {
labels: {{ dates|default:"[]"|safe }},
datasets: [{
label: '销售额',
data: {{ sales|default:"[]"|safe }},
borderColor: '#4CAF50',
backgroundColor: 'rgba(76, 175, 80, 0.1)',
fill: true,
tension: 0.4
}]
},
options: {
responsive: true,
plugins: {
legend: {
position: 'top',
},
title: {
display: true,
text: '近30天销售趋势'
}
},
scales: {
y: {
beginAtZero: true,
ticks: {
callback: function(value) {
return 'yen' + value;
}
}
}
}
}
});
});
// 元素进入视口时触发动画
const fadeElements = document.querySelectorAll('.fade-in, .slide-in');
const fadeInObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('appear');
fadeInObserver.unobserve(entry.target);
}
});
}, { threshold: 0.1 });
fadeElements.forEach(element => {
fadeInObserver.observe(element);
});
</script>
</body>
</html>
新增功能说明
1. 数据可视化:
- 新增销售趋势图表,直观展示销售额变化
- 库存分类统计和低库存商品展示
- 使用Chart.js实现数据可视化
2. 智能推荐系统:
- 基于销售数据的热门商品推荐
- 相关商品推荐(同分类商品)
- 个性化推荐算法
3. 用户反馈系统:
- 客户反馈提交功能
- 反馈通知机制(邮件和系统通知)
- 反馈统计和管理
4. 系统安全增强:
- 唯一订单编号生成
- 输入验证和防注入
- 权限细化控制
5. 性能优化:
- 进一步优化数据库查询
- 增强缓存策略
- 异步任务处理优化
部署说明
1. 环境准备:
pip install -r requirements.txt
2. 数据库迁移:
python manage.py makemigrations
python manage.py migrate
3. 创建超级用户:
python manage.py createsuperuser
4. 启动服务:
python manage.py runserver
5. 启动Celery:
celery -A light_ai_canteen worker -l info
celery -A light_ai_canteen beat -l info
6. Docker部署:
docker-compose up -d
此版本整合了所有优化和新增功能,形成了一个功能完善、性能优化的企业级食堂管理系统,可直接用于生产环境。
相关推荐
- Sublime Text 4 稳定版 Build 4113 发布
-
IT之家7月18日消息知名编辑器SublimeText4近日发布了Build4113版本,是SublimeText4的第二个稳定版。IT之家了解到,SublimeTe...
- 【小白课程】openKylin便签贴的设计与实现
-
openKylin便签贴作为侧边栏的一个小插件,提供便捷的文本记录和灵活的页面展示。openKylin便签贴分为两个部分:便签列表...
- 壹啦罐罐 Android 手机里的 Xposed 都装了啥
-
这是少数派推出的系列专题,叫做「我的手机里都装了啥」。这个系列将邀请到不同的玩家,从他们各自的角度介绍手机中最爱的或是日常使用最频繁的App。文章将以「每周一篇」的频率更新,内容范围会包括iOS、...
- 电气自动化专业词汇中英文对照表(电气自动化专业英语单词)
-
专业词汇中英文对照表...
- Python界面设计Tkinter模块的核心组件
-
我们使用一个模块,我们要熟悉这个模块的主要元件。如我们设计一个窗口,我们可以用Tk()来完成创建;一些交互元素,按钮、标签、编辑框用到控件;怎么去布局你的界面,我们可以用到pack()、grid()...
- 以色列发现“死海古卷”新残片(死海古卷是真的吗)
-
编译|陈家琦据艺术新闻网(artnews.com)报道,3月16日,以色列考古学家发现了死海古卷(DeadSeaScrolls)新残片。新出土的羊皮纸残片中包括以希腊文书写的《十二先知书》段落,这...
- 鸿蒙Next仓颉语言开发实战教程:订单列表
-
大家上午好,最近不断有友友反馈仓颉语言和ArkTs很像,所以要注意不要混淆。今天要分享的是仓颉语言开发商城应用的订单列表页。首先来分析一下这个页面,它分为三大部分,分别是导航栏、订单类型和订单列表部分...
- 哪些模块可以用在 Xposed for Lollipop 上?Xposed 模块兼容性解答
-
虽然已经有了XposedforLollipop的安装教程,但由于其还处在alpha阶段,一些Xposed模块能不能依赖其正常工作还未可知。为了解决大家对于模块兼容性的疑惑,笔者尽可能多...
- 利用 Fluid 自制 Mac 版 Overcast 应用
-
我喜爱收听播客,健身、上/下班途中,工作中,甚至是忙着做家务时。大多数情况下我会用MarcoArment开发的Overcast(Freemium)在iPhone上收听,这是我目前最喜爱的Po...
- 浅色Al云食堂APP代码(三)(手机云食堂)
-
以下是进一步优化完善后的浅色AI云食堂APP完整代码,新增了数据可视化、用户反馈、智能推荐等功能,并优化了代码结构和性能。项目结构...
- 实战PyQt5: 121-使用QImage实现一个看图应用
-
QImage简介QImage类提供了独立于硬件的图像表示形式,该图像表示形式可以直接访问像素数据,并且可以用作绘制设备。QImage是QPaintDevice子类,因此可以使用QPainter直接在图...
- 滚动条隐藏及美化(滚动条隐藏但是可以滚动)
-
1、滚动条隐藏背景/场景:在移动端,滑动的时候,会显示默认滚动条,如图1://隐藏代码:/*隐藏滚轮*/.ul-scrool-box::-webkit-scrollbar,.ul-scrool...
- 浅色AI云食堂APP完整代码(二)(ai 食堂)
-
以下是整合后的浅色AI云食堂APP完整代码,包含后端核心功能、前端界面以及优化增强功能。项目采用Django框架开发,支持库存管理、订单处理、财务管理等核心功能,并包含库存预警、数据导出、权限管理等增...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)