百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

浅色Al云食堂APP代码(三)(手机云食堂)

ztj100 2025-07-10 22:13 5 浏览 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便签贴分为两个部分:便签列表...

“告别 Neovim!为什么我投奔了刚开源的 Zed 编辑器?”

...

壹啦罐罐 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...

Avalonia日志组件实现与优化指南(ar日志表扣)

...

浅色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框架开发,支持库存管理、订单处理、财务管理等核心功能,并包含库存预警、数据导出、权限管理等增...

取消回复欢迎 发表评论: