Initial commit

This commit is contained in:
jiapengyu
2026-07-27 13:37:48 +08:00
commit ecba71e2a5
39123 changed files with 5989154 additions and 0 deletions
+135
View File
@@ -0,0 +1,135 @@
"use strict";
const common_vendor = require("../../../common/vendor.js");
const stores_user = require("../../../stores/user.js");
const _sfc_main = /* @__PURE__ */ common_vendor.defineComponent({
__name: "list",
setup(__props) {
const userStore = stores_user.useUserStore();
const searchKeyword = common_vendor.ref("");
const showAddModal = common_vendor.ref(false);
const editingUser = common_vendor.ref(null);
const formData = common_vendor.reactive({
name: "",
phone: "",
role: "collector"
});
const filteredUsers = common_vendor.computed(() => {
let users = userStore.users;
if (searchKeyword.value) {
const keyword = searchKeyword.value.toLowerCase();
users = users.filter(
(item) => item.name.toLowerCase().includes(keyword) || item.phone.includes(keyword)
);
}
return users;
});
const editUser = (user) => {
editingUser.value = user;
formData.name = user.name;
formData.phone = user.phone;
formData.role = user.role;
showAddModal.value = true;
};
const deleteUser = (id) => {
common_vendor.index.showModal({
title: "确认删除",
content: "确定要删除此用户吗?",
success: (res) => {
if (res.confirm) {
userStore.deleteUser(id);
common_vendor.index.showToast({ title: "删除成功", icon: "success" });
}
}
});
};
const closeModal = () => {
showAddModal.value = false;
editingUser.value = null;
formData.name = "";
formData.phone = "";
formData.role = "collector";
};
const saveUser = async () => {
if (!formData.name) {
common_vendor.index.showToast({ title: "请输入用户名", icon: "none" });
return;
}
if (!formData.phone || formData.phone.length !== 11) {
common_vendor.index.showToast({ title: "请输入正确的手机号", icon: "none" });
return;
}
if (editingUser.value) {
await userStore.updateUser({
id: editingUser.value.id,
name: formData.name,
phone: formData.phone,
role: formData.role
});
common_vendor.index.showToast({ title: "修改成功", icon: "success" });
} else {
await userStore.addUser({
name: formData.name,
phone: formData.phone,
role: formData.role
});
common_vendor.index.showToast({ title: "新增成功", icon: "success" });
}
closeModal();
};
const goToHome = () => {
common_vendor.index.redirectTo({ url: "/pages/admin/index" });
};
const goToOrderList = () => {
common_vendor.index.redirectTo({ url: "/pages/admin/order/list" });
};
const goToPriceManager = () => {
common_vendor.index.redirectTo({ url: "/pages/admin/price/list" });
};
common_vendor.onMounted(() => {
userStore.loadUsers();
});
return (_ctx, _cache) => {
return common_vendor.e({
a: common_vendor.o(($event) => showAddModal.value = true),
b: searchKeyword.value,
c: common_vendor.o(($event) => searchKeyword.value = $event.detail.value),
d: common_vendor.f(filteredUsers.value, (user, k0, i0) => {
return {
a: common_vendor.t(user.name.charAt(0)),
b: common_vendor.t(user.name),
c: common_vendor.t(user.phone),
d: common_vendor.t(user.role === "admin" ? "管理员" : "回收员"),
e: common_vendor.n(user.role),
f: common_vendor.o(($event) => editUser(user), user.id),
g: common_vendor.o(($event) => deleteUser(user.id), user.id),
h: user.id
};
}),
e: filteredUsers.value.length === 0
}, filteredUsers.value.length === 0 ? {} : {}, {
f: common_vendor.o(goToHome),
g: common_vendor.o(goToOrderList),
h: common_vendor.o(goToPriceManager),
i: showAddModal.value
}, showAddModal.value ? {
j: common_vendor.t(editingUser.value ? "编辑用户" : "新增用户"),
k: common_vendor.o(closeModal),
l: formData.name,
m: common_vendor.o(($event) => formData.name = $event.detail.value),
n: formData.phone,
o: common_vendor.o(($event) => formData.phone = $event.detail.value),
p: formData.role === "admin" ? 1 : "",
q: common_vendor.o(($event) => formData.role = "admin"),
r: formData.role === "collector" ? 1 : "",
s: common_vendor.o(($event) => formData.role = "collector"),
t: common_vendor.o(closeModal),
v: common_vendor.o(saveUser),
w: common_vendor.o(() => {
}),
x: common_vendor.o(closeModal)
} : {});
};
}
});
const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__scopeId", "data-v-709108fb"]]);
wx.createPage(MiniProgramPage);
+5
View File
@@ -0,0 +1,5 @@
{
"navigationStyle": "custom",
"navigationBarTitleText": "用户管理",
"usingComponents": {}
}
+1
View File
@@ -0,0 +1 @@
<view class="admin-container data-v-709108fb"><view class="admin-header data-v-709108fb"><view class="header-left data-v-709108fb"><text class="header-title data-v-709108fb">用户管理</text><text class="header-subtitle data-v-709108fb">系统用户列表</text></view><view class="header-right data-v-709108fb" bindtap="{{a}}"><text class="add-icon data-v-709108fb">+</text><text class="add-text data-v-709108fb">新增</text></view></view><view class="search-bar data-v-709108fb"><view class="search-input-wrap data-v-709108fb"><text class="search-icon data-v-709108fb">🔍</text><input type="text" class="search-input data-v-709108fb" placeholder="搜索用户名或手机号" value="{{b}}" bindinput="{{c}}"/></view></view><view class="user-list data-v-709108fb"><view wx:for="{{d}}" wx:for-item="user" wx:key="h" class="user-card data-v-709108fb"><view class="user-avatar data-v-709108fb"><text class="avatar-icon data-v-709108fb">{{user.a}}</text></view><view class="user-info data-v-709108fb"><view class="user-name data-v-709108fb">{{user.b}}</view><view class="user-phone data-v-709108fb">{{user.c}}</view></view><view class="user-role data-v-709108fb"><text class="{{['role-tag', 'data-v-709108fb', user.e]}}">{{user.d}}</text></view><view class="user-actions data-v-709108fb"><view class="action-btn edit data-v-709108fb" bindtap="{{user.f}}">✏️</view><view class="action-btn delete data-v-709108fb" bindtap="{{user.g}}">🗑️</view></view></view></view><view wx:if="{{e}}" class="empty-state data-v-709108fb"><text class="empty-icon data-v-709108fb">👥</text><text class="empty-text data-v-709108fb">暂无用户</text></view><view class="tab-bar data-v-709108fb"><view class="tab-item data-v-709108fb" bindtap="{{f}}"><text class="tab-icon data-v-709108fb">🏠</text><text class="tab-text data-v-709108fb">首页</text></view><view class="tab-item data-v-709108fb" bindtap="{{g}}"><text class="tab-icon data-v-709108fb">📋</text><text class="tab-text data-v-709108fb">订单</text></view><view class="tab-item data-v-709108fb" bindtap="{{h}}"><text class="tab-icon data-v-709108fb">💰</text><text class="tab-text data-v-709108fb">价格</text></view><view class="tab-item active data-v-709108fb"><text class="tab-icon data-v-709108fb">👥</text><text class="tab-text data-v-709108fb">用户</text></view></view><view wx:if="{{i}}" class="modal-overlay data-v-709108fb" bindtap="{{x}}"><view class="modal-box data-v-709108fb" catchtap="{{w}}"><view class="modal-header data-v-709108fb"><text class="modal-title data-v-709108fb">{{j}}</text><view class="modal-close data-v-709108fb" bindtap="{{k}}">×</view></view><view class="modal-body data-v-709108fb"><view class="form-group data-v-709108fb"><text class="form-label data-v-709108fb">用户名</text><input type="text" class="form-input data-v-709108fb" placeholder="请输入用户名" value="{{l}}" bindinput="{{m}}"/></view><view class="form-group data-v-709108fb"><text class="form-label data-v-709108fb">手机号</text><input type="number" class="form-input data-v-709108fb" placeholder="请输入手机号" value="{{n}}" bindinput="{{o}}"/></view><view class="form-group data-v-709108fb"><text class="form-label data-v-709108fb">角色</text><view class="role-options data-v-709108fb"><view class="{{['role-option', 'data-v-709108fb', p && 'active']}}" bindtap="{{q}}">管理员</view><view class="{{['role-option', 'data-v-709108fb', r && 'active']}}" bindtap="{{s}}">回收员</view></view></view></view><view class="modal-footer data-v-709108fb"><view class="modal-btn cancel data-v-709108fb" bindtap="{{t}}">取消</view><view class="modal-btn confirm data-v-709108fb" bindtap="{{v}}">保存</view></view></view></view></view>
+275
View File
@@ -0,0 +1,275 @@
.admin-container.data-v-709108fb {
min-height: 100vh;
background: #f5f5f5;
padding-bottom: 120rpx;
}
.admin-header.data-v-709108fb {
display: flex;
justify-content: space-between;
align-items: center;
padding: 60rpx 30rpx 30rpx;
background: linear-gradient(135deg, #3366ff 0%, #254edb 100%);
}
.admin-header .header-left .header-title.data-v-709108fb {
font-size: 40rpx;
font-weight: bold;
color: #fff;
display: block;
}
.admin-header .header-left .header-subtitle.data-v-709108fb {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.8);
margin-top: 8rpx;
display: block;
}
.admin-header .header-right.data-v-709108fb {
display: flex;
align-items: center;
background: rgba(255, 255, 255, 0.2);
padding: 16rpx 32rpx;
border-radius: 40rpx;
}
.admin-header .header-right .add-icon.data-v-709108fb {
font-size: 32rpx;
color: #fff;
margin-right: 8rpx;
}
.admin-header .header-right .add-text.data-v-709108fb {
font-size: 28rpx;
color: #fff;
}
.search-bar.data-v-709108fb {
padding: 20rpx 30rpx;
}
.search-bar .search-input-wrap.data-v-709108fb {
display: flex;
align-items: center;
background: #fff;
border-radius: 40rpx;
padding: 0 30rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
}
.search-bar .search-input-wrap .search-icon.data-v-709108fb {
font-size: 28rpx;
margin-right: 20rpx;
}
.search-bar .search-input-wrap .search-input.data-v-709108fb {
flex: 1;
height: 80rpx;
font-size: 28rpx;
}
.user-list.data-v-709108fb {
padding: 0 30rpx;
}
.user-card.data-v-709108fb {
display: flex;
align-items: center;
background: #fff;
border-radius: 20rpx;
padding: 30rpx;
margin-bottom: 20rpx;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
}
.user-card .user-avatar.data-v-709108fb {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
background: linear-gradient(135deg, #3366ff 0%, #254edb 100%);
display: flex;
align-items: center;
justify-content: center;
margin-right: 24rpx;
}
.user-card .user-avatar .avatar-icon.data-v-709108fb {
font-size: 32rpx;
color: #fff;
font-weight: bold;
}
.user-card .user-info.data-v-709108fb {
flex: 1;
}
.user-card .user-info .user-name.data-v-709108fb {
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.user-card .user-info .user-phone.data-v-709108fb {
font-size: 24rpx;
color: #999;
margin-top: 8rpx;
}
.user-card .user-role.data-v-709108fb {
margin-right: 24rpx;
}
.user-card .user-role .role-tag.data-v-709108fb {
font-size: 22rpx;
padding: 8rpx 20rpx;
border-radius: 20rpx;
}
.user-card .user-role .role-tag.admin.data-v-709108fb {
background: #ffebee;
color: #e53935;
}
.user-card .user-role .role-tag.collector.data-v-709108fb {
background: #e3f2fd;
color: #1976d2;
}
.user-card .user-actions.data-v-709108fb {
display: flex;
}
.user-card .user-actions .action-btn.data-v-709108fb {
width: 60rpx;
height: 60rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-left: 10rpx;
}
.user-card .user-actions .action-btn.edit.data-v-709108fb {
background: #fff3e0;
}
.user-card .user-actions .action-btn.delete.data-v-709108fb {
background: #ffebee;
}
.empty-state.data-v-709108fb {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 100rpx 0;
}
.empty-state .empty-icon.data-v-709108fb {
font-size: 100rpx;
margin-bottom: 20rpx;
}
.empty-state .empty-text.data-v-709108fb {
font-size: 28rpx;
color: #999;
}
.tab-bar.data-v-709108fb {
position: fixed;
bottom: 0;
left: 0;
right: 0;
display: flex;
background: #fff;
padding: 20rpx 0 60rpx;
box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
}
.tab-bar .tab-item.data-v-709108fb {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
}
.tab-bar .tab-item .tab-icon.data-v-709108fb {
font-size: 40rpx;
margin-bottom: 8rpx;
}
.tab-bar .tab-item .tab-text.data-v-709108fb {
font-size: 22rpx;
color: #999;
}
.tab-bar .tab-item.active .tab-text.data-v-709108fb {
color: #3366ff;
font-weight: bold;
}
.modal-overlay.data-v-709108fb {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal-overlay .modal-box.data-v-709108fb {
width: 600rpx;
background: #fff;
border-radius: 30rpx;
overflow: hidden;
}
.modal-overlay .modal-box .modal-header.data-v-709108fb {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30rpx;
border-bottom: 1rpx solid #eee;
}
.modal-overlay .modal-box .modal-header .modal-title.data-v-709108fb {
font-size: 34rpx;
font-weight: bold;
color: #333;
}
.modal-overlay .modal-box .modal-header .modal-close.data-v-709108fb {
font-size: 40rpx;
color: #999;
padding: 10rpx;
}
.modal-overlay .modal-box .modal-body.data-v-709108fb {
padding: 30rpx;
}
.modal-overlay .modal-box .modal-body .form-group.data-v-709108fb {
margin-bottom: 30rpx;
}
.modal-overlay .modal-box .modal-body .form-group .form-label.data-v-709108fb {
font-size: 28rpx;
color: #666;
margin-bottom: 16rpx;
display: block;
}
.modal-overlay .modal-box .modal-body .form-group .form-input.data-v-709108fb {
width: 100%;
height: 80rpx;
border: 2rpx solid #eee;
border-radius: 16rpx;
padding: 0 24rpx;
font-size: 28rpx;
box-sizing: border-box;
}
.modal-overlay .modal-box .modal-body .form-group .role-options.data-v-709108fb {
display: flex;
}
.modal-overlay .modal-box .modal-body .form-group .role-options .role-option.data-v-709108fb {
flex: 1;
height: 80rpx;
border: 2rpx solid #eee;
border-radius: 16rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 28rpx;
margin-right: 20rpx;
}
.modal-overlay .modal-box .modal-body .form-group .role-options .role-option.data-v-709108fb:last-child {
margin-right: 0;
}
.modal-overlay .modal-box .modal-body .form-group .role-options .role-option.active.data-v-709108fb {
border-color: #3366ff;
color: #3366ff;
background: rgba(51, 102, 255, 0.1);
}
.modal-overlay .modal-box .modal-footer.data-v-709108fb {
display: flex;
border-top: 1rpx solid #eee;
}
.modal-overlay .modal-box .modal-footer .modal-btn.data-v-709108fb {
flex: 1;
height: 88rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 32rpx;
}
.modal-overlay .modal-box .modal-footer .modal-btn.cancel.data-v-709108fb {
color: #666;
border-right: 1rpx solid #eee;
}
.modal-overlay .modal-box .modal-footer .modal-btn.confirm.data-v-709108fb {
color: #3366ff;
font-weight: bold;
}