Skip to content

Commit b4a9240

Browse files
committed
开发者 model
1 parent 6358f9e commit b4a9240

12 files changed

+185
-47
lines changed

SwiftPamphletApp.xcodeproj/project.pbxproj

+20-4
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
08397E2D2B9F10AD00DFDD02 /* EditCategoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08397E2C2B9F10AD00DFDD02 /* EditCategoryView.swift */; };
3535
08397E2F2B9F353B00DFDD02 /* CategoryListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08397E2E2B9F353B00DFDD02 /* CategoryListView.swift */; };
3636
08397E322B9F39C100DFDD02 /* SwiftSoup in Frameworks */ = {isa = PBXBuildFile; productRef = 08397E312B9F39C100DFDD02 /* SwiftSoup */; };
37-
08397E342BA0178500DFDD02 /* DetailLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08397E332BA0178500DFDD02 /* DetailLink.swift */; };
3837
084417752B99B9060049297D /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 084417742B99B9060049297D /* HomeView.swift */; };
3938
084417772B99BA3F0049297D /* SidebarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 084417762B99BA3F0049297D /* SidebarView.swift */; };
4039
084417792B99BE720049297D /* DataLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 084417782B99BE720049297D /* DataLink.swift */; };
@@ -269,6 +268,9 @@
269268
08F4BE6028609D8700733F12 /* PlayCharts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08F4BE5F28609D8600733F12 /* PlayCharts.swift */; };
270269
08F4BE6228616DC100733F12 /* PlayWeatherKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08F4BE6128616DC100733F12 /* PlayWeatherKit.swift */; };
271270
08F51BC527A374A500693AB6 /* footer_js.html in Resources */ = {isa = PBXBuildFile; fileRef = 08F51BC427A374A500693AB6 /* footer_js.html */; };
271+
3AE0D59A2BAB0A0600D6D925 /* DeveloperListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AE0D5992BAB0A0600D6D925 /* DeveloperListView.swift */; };
272+
3AE0D59C2BAB0BD800D6D925 /* DeveloperModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AE0D59B2BAB0BD800D6D925 /* DeveloperModel.swift */; };
273+
3AE0D59E2BAB183100D6D925 /* EditDeveloper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AE0D59D2BAB183100D6D925 /* EditDeveloper.swift */; };
272274
/* End PBXBuildFile section */
273275

274276
/* Begin PBXFileReference section */
@@ -299,7 +301,6 @@
299301
08397E282B9F0A9100DFDD02 /* EditInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditInfoView.swift; sourceTree = "<group>"; };
300302
08397E2C2B9F10AD00DFDD02 /* EditCategoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditCategoryView.swift; sourceTree = "<group>"; };
301303
08397E2E2B9F353B00DFDD02 /* CategoryListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryListView.swift; sourceTree = "<group>"; };
302-
08397E332BA0178500DFDD02 /* DetailLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailLink.swift; sourceTree = "<group>"; };
303304
084417742B99B9060049297D /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = "<group>"; };
304305
084417762B99BA3F0049297D /* SidebarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarView.swift; sourceTree = "<group>"; };
305306
084417782B99BE720049297D /* DataLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataLink.swift; sourceTree = "<group>"; };
@@ -529,6 +530,9 @@
529530
08F4BE5F28609D8600733F12 /* PlayCharts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayCharts.swift; sourceTree = "<group>"; };
530531
08F4BE6128616DC100733F12 /* PlayWeatherKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayWeatherKit.swift; sourceTree = "<group>"; };
531532
08F51BC427A374A500693AB6 /* footer_js.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = footer_js.html; sourceTree = "<group>"; };
533+
3AE0D5992BAB0A0600D6D925 /* DeveloperListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperListView.swift; sourceTree = "<group>"; };
534+
3AE0D59B2BAB0BD800D6D925 /* DeveloperModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperModel.swift; sourceTree = "<group>"; };
535+
3AE0D59D2BAB183100D6D925 /* EditDeveloper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditDeveloper.swift; sourceTree = "<group>"; };
532536
/* End PBXFileReference section */
533537

534538
/* Begin PBXFrameworksBuildPhase section */
@@ -603,7 +607,6 @@
603607
084417742B99B9060049297D /* HomeView.swift */,
604608
084417762B99BA3F0049297D /* SidebarView.swift */,
605609
084417782B99BE720049297D /* DataLink.swift */,
606-
08397E332BA0178500DFDD02 /* DetailLink.swift */,
607610
);
608611
path = HomeUI;
609612
sourceTree = "<group>";
@@ -1148,6 +1151,7 @@
11481151
086A5F252744ECD700FECE02 /* GitHubAPI */ = {
11491152
isa = PBXGroup;
11501153
children = (
1154+
3AE0D5962BAB09AB00D6D925 /* Developer */,
11511155
086A5F392744EDA500FECE02 /* GitHubAPIModel.swift */,
11521156
08BF26D4276B18380064DDAC /* Network */,
11531157
086A5F652754C23200FECE02 /* DB */,
@@ -1382,6 +1386,16 @@
13821386
path = Category;
13831387
sourceTree = "<group>";
13841388
};
1389+
3AE0D5962BAB09AB00D6D925 /* Developer */ = {
1390+
isa = PBXGroup;
1391+
children = (
1392+
3AE0D5992BAB0A0600D6D925 /* DeveloperListView.swift */,
1393+
3AE0D59D2BAB183100D6D925 /* EditDeveloper.swift */,
1394+
3AE0D59B2BAB0BD800D6D925 /* DeveloperModel.swift */,
1395+
);
1396+
path = Developer;
1397+
sourceTree = "<group>";
1398+
};
13851399
/* End PBXGroup section */
13861400

13871401
/* Begin PBXNativeTarget section */
@@ -1651,6 +1665,7 @@
16511665
08BE634627C48C5B002BC6A8 /* PlayToggleView.swift in Sources */,
16521666
08448F41279AC1A900B61353 /* PlayMacOS.swift in Sources */,
16531667
0896FB9027BA39B100676B7F /* PlayButtonView.swift in Sources */,
1668+
3AE0D59C2BAB0BD800D6D925 /* DeveloperModel.swift in Sources */,
16541669
08BE635A27C6575C002BC6A8 /* PlayGroupBoxView.swift in Sources */,
16551670
08BF26D8276B5D7F0064DDAC /* ExploreRepoListView.swift in Sources */,
16561671
088EE8F527BD24E000764525 /* PlayLinkView.swift in Sources */,
@@ -1666,6 +1681,7 @@
16661681
08397E2F2B9F353B00DFDD02 /* CategoryListView.swift in Sources */,
16671682
086A5F402744EDCE00FECE02 /* RepoVM.swift in Sources */,
16681683
08BE636627C88750002BC6A8 /* PlayProgressView.swift in Sources */,
1684+
3AE0D59A2BAB0A0600D6D925 /* DeveloperListView.swift in Sources */,
16691685
084417772B99BA3F0049297D /* SidebarView.swift in Sources */,
16701686
08F4BE6028609D8700733F12 /* PlayCharts.swift in Sources */,
16711687
086A5F2E2744ED8600FECE02 /* ActiveDeveloperListView.swift in Sources */,
@@ -1676,7 +1692,6 @@
16761692
08AEAEF3277F09FA00B969E2 /* NavView.swift in Sources */,
16771693
086A5F352744ED9600FECE02 /* IssueView.swift in Sources */,
16781694
08522BF027CF9FFA005FF059 /* PlayAnimation.swift in Sources */,
1679-
08397E342BA0178500DFDD02 /* DetailLink.swift in Sources */,
16801695
08AEAEDD277EA64900B969E2 /* DBDevNoti.swift in Sources */,
16811696
08BE635E27C72F50002BC6A8 /* PlayNavigationView.swift in Sources */,
16821697
08448F0D2799035600B61353 /* PlaySecurity.swift in Sources */,
@@ -1721,6 +1736,7 @@
17211736
08522BE227CF52ED005FF059 /* PlayColor.swift in Sources */,
17221737
08BE636A27C8C409002BC6A8 /* PlayImageView.swift in Sources */,
17231738
08CD61FF27758B8A008C0935 /* Token.swift in Sources */,
1739+
3AE0D59E2BAB183100D6D925 /* EditDeveloper.swift in Sources */,
17241740
08B4C9392770B26700742084 /* CCYRSSReq.swift in Sources */,
17251741
086A5F462744EEB900FECE02 /* FundationFunction.swift in Sources */,
17261742
08AEAEE1277EA70500B969E2 /* DBRepoStore.swift in Sources */,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
//
2+
// DeveloperListView.swift
3+
// SwiftPamphletApp
4+
//
5+
// Created by Ming on 2024/3/20.
6+
//
7+
8+
import SwiftUI
9+
import SwiftData
10+
11+
struct DeveloperListView: View {
12+
@Environment(\.modelContext) var modelContext
13+
@Binding var selectDev: DeveloperModel?
14+
@Query(DeveloperModel.all) var devs: [DeveloperModel]
15+
16+
var body: some View {
17+
List(selection: $selectDev) {
18+
ForEach(devs) { dev in
19+
Text(dev.name)
20+
.swipeActions {
21+
Button(role: .destructive) {
22+
DeveloperModel.delete(dev)
23+
} label: {
24+
Label("删除", systemImage: "trash")
25+
}
26+
}
27+
.contextMenu {
28+
Button("删除") {
29+
DeveloperModel.delete(dev)
30+
}
31+
}
32+
}
33+
}
34+
.listStyle(.inset)
35+
.alternatingRowBackgrounds()
36+
.toolbar(content: {
37+
ToolbarItem(placement: .navigation) {
38+
Button("添加开发者", systemImage: "plus", action: addDev)
39+
}
40+
ToolbarItem(placement: .primaryAction) {
41+
Button(action: {
42+
modelContext.undoManager?.undo()
43+
}, label: {
44+
Image(systemName: "arrow.uturn.backward.circle")
45+
Text("撤回")
46+
})
47+
.disabled(modelContext.undoManager?.canUndo == false)
48+
}
49+
ToolbarItem(placement: .primaryAction) {
50+
Button(action: {
51+
modelContext.undoManager?.redo()
52+
}, label: {
53+
Image(systemName: "arrow.uturn.forward.circle")
54+
Text("重做")
55+
})
56+
.disabled(modelContext.undoManager?.canRedo == false)
57+
}
58+
})
59+
}
60+
61+
func addDev() {
62+
let dev = DeveloperModel(name: "new", unread: 0, createDate: Date.now, updateDate: Date.now)
63+
modelContext.insert(dev)
64+
selectDev = dev
65+
}
66+
}
67+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//
2+
// DeveloperModel.swift
3+
// SwiftPamphletApp
4+
//
5+
// Created by Ming on 2024/3/20.
6+
//
7+
8+
import Foundation
9+
import SwiftData
10+
11+
@Model
12+
final class DeveloperModel {
13+
var name: String = ""
14+
var unread: Int = 0
15+
16+
var createDate: Date = Date.now
17+
var updateDate: Date = Date.now
18+
19+
init(name: String, unread: Int, createDate: Date, updateDate: Date) {
20+
self.name = name
21+
self.unread = unread
22+
self.createDate = createDate
23+
self.updateDate = updateDate
24+
}
25+
26+
static var all: FetchDescriptor<DeveloperModel> {
27+
let fd = FetchDescriptor(sortBy: [SortDescriptor(\DeveloperModel.updateDate, order: .reverse)])
28+
return fd
29+
}
30+
31+
static func delete(_ dev: DeveloperModel) {
32+
if let context = dev.modelContext {
33+
context.delete(dev)
34+
}
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//
2+
// EditDeveloper.swift
3+
// SwiftPamphletApp
4+
//
5+
// Created by Ming on 2024/3/20.
6+
//
7+
8+
import SwiftUI
9+
10+
struct EditDeveloper: View {
11+
@Bindable var dev: DeveloperModel
12+
var body: some View {
13+
Text("Hello, World!")
14+
}
15+
}
16+
17+

SwiftPamphletApp/HomeUI/DataLink.swift

+10-10
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,19 @@ struct DataLink: Identifiable {
1414
var children: [DataLink]?
1515

1616
@ViewBuilder
17-
static func viewToShow(for title: String?, selectInfo:Binding<IOInfo?>) -> some View {
17+
static func viewToShow(
18+
for title: String?,
19+
selectInfo:Binding<IOInfo?>,
20+
selectDev:Binding<DeveloperModel?>
21+
) -> some View {
1822
switch title {
1923
case "资料整理":
2024
InfoListView(selectInfo: selectInfo)
2125
case "库动态":
2226
ExploreRepoListView(showAsGroup: false)
2327
case "开发者":
24-
ActiveDeveloperListView(vm: IssueVM(repoName: SPC.pamphletIssueRepoName, issueNumber: 30))
28+
DeveloperListView(selectDev:selectDev)
29+
// ActiveDeveloperListView(vm: IssueVM(repoName: SPC.pamphletIssueRepoName, issueNumber: 30))
2530
case "探索库":
2631
ExploreRepoListView(showAsGroup: true)
2732
case "库存档":
@@ -38,8 +43,6 @@ struct DataLink: Identifiable {
3843
IssuesListFromCustomView(vm: IssueVM(guideName:"lib-Combine"))
3944
case "Concurrency":
4045
IssuesListFromCustomView(vm: IssueVM(guideName:"lib-Concurrency"))
41-
case "设置":
42-
SettingView()
4346
default:
4447
// 默认是语法速查
4548
IssuesListFromCustomView(vm: IssueVM(guideName: "guide-syntax"))
@@ -52,12 +55,12 @@ extension DataLink {
5255
DataLink(title: "资料", imageName: "", children: [
5356
DataLink(title: "资料整理", imageName: "p11")
5457
]),
55-
// DataLink(title: "Github", imageName: "", children: [
58+
DataLink(title: "Github", imageName: "", children: [
5659
// DataLink(title: "库动态", imageName: "p6"),
57-
// DataLink(title: "开发者", imageName: "p5"),
60+
DataLink(title: "开发者", imageName: "p5"),
5861
// DataLink(title: "探索库", imageName: "p24"),
5962
// DataLink(title: "库存档", imageName: "p25")
60-
// ]),
63+
]),
6164
DataLink(title: "Swift指南", imageName: "", children: [
6265
DataLink(title: "语法速查", imageName: "p23"),
6366
DataLink(title: "特性", imageName: "p10"),
@@ -67,9 +70,6 @@ extension DataLink {
6770
DataLink(title: "SwiftUI", imageName: "p3"),
6871
DataLink(title: "Combine", imageName: "p19"),
6972
DataLink(title: "Concurrency", imageName: "p1")
70-
]),
71-
DataLink(title: "更多", imageName: "", children: [
72-
DataLink(title: "设置", imageName: "p4")
7373
])
7474
]
7575
}

SwiftPamphletApp/HomeUI/DetailLink.swift

-21
This file was deleted.

SwiftPamphletApp/HomeUI/HomeView.swift

+14-4
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,21 @@ struct HomeView: View {
1111
@State var appVM = AppVM()
1212
@State private var selectedDataLinkString: String?
1313
@State private var selectInfo: IOInfo? = nil
14+
@State private var selectDev: DeveloperModel? = nil
1415

1516
var body: some View {
1617
NavigationSplitView {
17-
SidebarView(selectedDataLinkString: $selectedDataLinkString, selectInfo: $selectInfo)
18+
SidebarView(
19+
selectedDataLinkString: $selectedDataLinkString,
20+
selectInfo: $selectInfo
21+
)
1822
} content: {
1923
if let link = selectedDataLinkString {
20-
DataLink.viewToShow(for: link, selectInfo: $selectInfo)
24+
DataLink.viewToShow(
25+
for: link,
26+
selectInfo: $selectInfo,
27+
selectDev: $selectDev
28+
)
2129
} else {
2230
ContentUnavailableView {
2331
Label("未选择栏目",
@@ -28,13 +36,15 @@ struct HomeView: View {
2836
}
2937
} detail: {
3038
if let info = selectInfo {
31-
DetailLink.viewToShow(for: "资料", selectInfo: info)
39+
EditInfoView(info: info)
40+
} else if let dev = selectDev {
41+
EditDeveloper(dev: dev)
3242
} else {
3343
ContentUnavailableView {
3444
Label("未选",
3545
systemImage: "pencil.tip.crop.circle.badge.plus")
3646
} description: {
37-
Text("请选择或按+号增加一个资料")
47+
Text("请选择或按+号添加内容")
3848
}
3949
}
4050
}

SwiftPamphletApp/InfoOrganizer/Info/EditInfoView.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ struct EditInfoView: View {
114114
} // end form
115115
.padding(10)
116116
.inspector(isPresented: $isShowInspector) {
117-
EditCategoryView(cate: cate ?? IOCategory(name: "unavailable.com", createDate: Date.now, updateDate: Date.now))
117+
EditCategoryView(cate: cate ?? IOCategory(name: "unavailable.com", infos: [IOInfo](), pin: 0, createDate: Date.now, updateDate: Date.now))
118118
}
119119
.toolbar {
120120
Button("关闭", systemImage: "sidebar.right") {
@@ -126,7 +126,7 @@ struct EditInfoView: View {
126126
} // end VStack
127127
}
128128
func addCate() {
129-
cate = IOCategory(name: "", createDate: Date.now, updateDate: Date.now)
129+
cate = IOCategory(name: "", infos: [IOInfo](), pin: 0, createDate: Date.now, updateDate: Date.now)
130130
modelContext.insert(cate!)
131131
isShowInspector = true
132132
}

SwiftPamphletApp/InfoOrganizer/Info/InfoListView.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,12 @@ struct InfoListView: View {
8383
}
8484

8585
func addInfo() {
86-
let info = IOInfo(name: "简单记录", url: "", des: "\n", createDate: Date.now, updateDate: Date.now)
86+
let info = IOInfo(name: "简单记录", url: "", des: "\n", star: false, createDate: Date.now, updateDate: Date.now)
8787
modelContext.insert(info)
8888
selectInfo = info
8989
}
9090
func addInfoWithCate() {
91-
let info = IOInfo(name: "\(filterCate) - 简单记录", url: "", des: "\n", createDate: Date.now, updateDate: Date.now)
91+
let info = IOInfo(name: "\(filterCate) - 简单记录", url: "", des: "\n", star: false, createDate: Date.now, updateDate: Date.now)
9292
for cate in cates {
9393
if cate.name == filterCate {
9494
info.category = cate

0 commit comments

Comments
 (0)