mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 13:10:26 +08:00 
			
		
		
		
	支持购买套餐/续费套餐/用户账户操作等
This commit is contained in:
		@@ -380,6 +380,18 @@ func (this *RPCClient) UserBillRPC() pb.UserBillServiceClient {
 | 
				
			|||||||
	return pb.NewUserBillServiceClient(this.pickConn())
 | 
						return pb.NewUserBillServiceClient(this.pickConn())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *RPCClient) UserAccountRPC() pb.UserAccountServiceClient {
 | 
				
			||||||
 | 
						return pb.NewUserAccountServiceClient(this.pickConn())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *RPCClient) UserAccountLogRPC() pb.UserAccountLogServiceClient {
 | 
				
			||||||
 | 
						return pb.NewUserAccountLogServiceClient(this.pickConn())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *RPCClient) UserAccountDailyStatRPC() pb.UserAccountDailyStatServiceClient {
 | 
				
			||||||
 | 
						return pb.NewUserAccountDailyStatServiceClient(this.pickConn())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *RPCClient) UserAccessKeyRPC() pb.UserAccessKeyServiceClient {
 | 
					func (this *RPCClient) UserAccessKeyRPC() pb.UserAccessKeyServiceClient {
 | 
				
			||||||
	return pb.NewUserAccessKeyServiceClient(this.pickConn())
 | 
						return pb.NewUserAccessKeyServiceClient(this.pickConn())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@ import (
 | 
				
			|||||||
	"github.com/iwind/TeaGo/maps"
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
 | 
						"net/url"
 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -368,12 +369,31 @@ func (this *userMustAuth) modules(actionPtr actions.ActionWrapper, adminId int64
 | 
				
			|||||||
			"icon":   "users",
 | 
								"icon":   "users",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"code":     "finance",
 | 
								"code":   "finance",
 | 
				
			||||||
			"module":   configloaders.AdminModuleCodeFinance,
 | 
								"module": configloaders.AdminModuleCodeFinance,
 | 
				
			||||||
			"name":     "财务管理",
 | 
								"name":   "财务管理",
 | 
				
			||||||
			"icon":     "yen sign",
 | 
								"icon":   "yen sign",
 | 
				
			||||||
			"isOn":     teaconst.IsPlus,
 | 
								"isOn":   teaconst.IsPlus,
 | 
				
			||||||
			"subItems": []maps.Map{},
 | 
								"subItems": []maps.Map{
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										"name": "用户账户",
 | 
				
			||||||
 | 
										"url":  "/finance/accounts",
 | 
				
			||||||
 | 
										"code": "accounts",
 | 
				
			||||||
 | 
										"isOn": teaconst.IsPlus,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										"name": "操作记录",
 | 
				
			||||||
 | 
										"url":  "/finance/logs",
 | 
				
			||||||
 | 
										"code": "logs",
 | 
				
			||||||
 | 
										"isOn": teaconst.IsPlus,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										"name": "收支报表",
 | 
				
			||||||
 | 
										"url":  "/finance/income",
 | 
				
			||||||
 | 
										"code": "income",
 | 
				
			||||||
 | 
										"isOn": teaconst.IsPlus,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"code":   "plans",
 | 
								"code":   "plans",
 | 
				
			||||||
@@ -443,5 +463,5 @@ func (this *userMustAuth) modules(actionPtr actions.ActionWrapper, adminId int64
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// 跳转到登录页
 | 
					// 跳转到登录页
 | 
				
			||||||
func (this *userMustAuth) login(action *actions.ActionObject) {
 | 
					func (this *userMustAuth) login(action *actions.ActionObject) {
 | 
				
			||||||
	action.RedirectURL("/")
 | 
						action.RedirectURL("/?from=" + url.QueryEscape(action.Request.RequestURI))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										33
									
								
								web/public/js/components/finance/finance-user-selector.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								web/public/js/components/finance/finance-user-selector.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					Vue.component("finance-user-selector", {
 | 
				
			||||||
 | 
						mounted: function () {
 | 
				
			||||||
 | 
							let that = this
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Tea.action("/finance/users/options")
 | 
				
			||||||
 | 
								.post()
 | 
				
			||||||
 | 
								.success(function (resp) {
 | 
				
			||||||
 | 
									that.users = resp.data.users
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						props: ["v-user-id"],
 | 
				
			||||||
 | 
						data: function () {
 | 
				
			||||||
 | 
							let userId = this.vUserId
 | 
				
			||||||
 | 
							if (userId == null) {
 | 
				
			||||||
 | 
								userId = 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								users: [],
 | 
				
			||||||
 | 
								userId: userId
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						watch: {
 | 
				
			||||||
 | 
							userId: function (v) {
 | 
				
			||||||
 | 
								this.$emit("change", v)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						template: `<div>
 | 
				
			||||||
 | 
						<select class="ui dropdown auto-width" name="userId" v-model="userId">
 | 
				
			||||||
 | 
							<option value="0">[选择用户]</option>
 | 
				
			||||||
 | 
							<option v-for="user in users" :value="user.id">{{user.fullname}} ({{user.username}})</option>
 | 
				
			||||||
 | 
						</select>
 | 
				
			||||||
 | 
					</div>`
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
@@ -19,6 +19,11 @@ Vue.component("plan-user-selector", {
 | 
				
			|||||||
			userId: userId
 | 
								userId: userId
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						watch: {
 | 
				
			||||||
 | 
							userId: function (v) {
 | 
				
			||||||
 | 
								this.$emit("change", v)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	template: `<div>
 | 
						template: `<div>
 | 
				
			||||||
	<select class="ui dropdown auto-width" name="userId" v-model="userId">
 | 
						<select class="ui dropdown auto-width" name="userId" v-model="userId">
 | 
				
			||||||
		<option value="0">[选择用户]</option>
 | 
							<option value="0">[选择用户]</option>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								web/public/js/components/users/user-link.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								web/public/js/components/users/user-link.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					Vue.component("user-link", {
 | 
				
			||||||
 | 
						props: ["v-user", "v-keyword"],
 | 
				
			||||||
 | 
						data: function () {
 | 
				
			||||||
 | 
							let user = this.vUser
 | 
				
			||||||
 | 
							if (user == null) {
 | 
				
			||||||
 | 
								user = {id: 0, "username": "", "fullname": ""}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								user: user
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						template: `<div style="display: inline-block">
 | 
				
			||||||
 | 
						<span v-if="user.id > 0"><keyword :v-word="vKeyword">{{user.fullname}}</keyword><span class="small grey">(<keyword :v-word="vKeyword">{{user.username}}</keyword>)</span></span>
 | 
				
			||||||
 | 
						<span v-else class="disabled">[已删除]</span>
 | 
				
			||||||
 | 
					</div>`
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
							
								
								
									
										6
									
								
								web/views/@default/finance/income/@menu.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								web/views/@default/finance/income/@menu.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					<first-menu>
 | 
				
			||||||
 | 
					    <menu-item href="." code="daily">按天统计</menu-item>
 | 
				
			||||||
 | 
					    <menu-item href=".monthly" code="monthly">按月统计</menu-item>
 | 
				
			||||||
 | 
					</first-menu>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="margin"></div>
 | 
				
			||||||
		Reference in New Issue
	
	Block a user