Browse Source

Merge remote-tracking branch 'origin/master'

liao-sea 10 months ago
parent
commit
4f9a895516

+ 90 - 79
doc/就业驿站管理系统.pdb

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<?PowerDesigner AppLocale="UTF16" ID="{2D964471-9870-48BE-90E9-524D40D03B42}" Label="" LastModificationDate="1713834291" Name="就业驿站管理系统" Objects="526" Symbols="45" Target="MySQL 5.0" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="16.0.0.3514"?>
+<?PowerDesigner AppLocale="UTF16" ID="{2D964471-9870-48BE-90E9-524D40D03B42}" Label="" LastModificationDate="1713834576" Name="就业驿站管理系统" Objects="527" Symbols="45" Target="MySQL 5.0" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="16.0.0.3514"?>
 <!-- do not edit this file -->
 
 <Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object">
@@ -4662,8 +4662,8 @@ Reference.ParentRole 1</a:SymbolContent>
 <o:ReferenceSymbol Id="o50">
 <a:CreationDate>1701661162</a:CreationDate>
 <a:ModificationDate>1703661889</a:ModificationDate>
-<a:Rect>((-121277,61775), (-99347,77179))</a:Rect>
-<a:ListOfPoints>((-99747,76779),(-115326,76779),(-115326,62175),(-120877,62175))</a:ListOfPoints>
+<a:Rect>((-121277,61355), (-99347,77179))</a:Rect>
+<a:ListOfPoints>((-99747,76779),(-115326,76779),(-115326,61755),(-120877,61755))</a:ListOfPoints>
 <a:CornerStyle>2</a:CornerStyle>
 <a:ArrowStyle>1</a:ArrowStyle>
 <a:LineColor>16744448</a:LineColor>
@@ -4716,8 +4716,8 @@ DESTINATION 0 新宋体,8,N</a:FontList>
 <o:ReferenceSymbol Id="o55">
 <a:CreationDate>1703661452</a:CreationDate>
 <a:ModificationDate>1703661452</a:ModificationDate>
-<a:Rect>((-153107,72949), (-124224,81267))</a:Rect>
-<a:ListOfPoints>((-127224,73349),(-127224,80867),(-152707,80867))</a:ListOfPoints>
+<a:Rect>((-153107,72949), (-126824,81267))</a:Rect>
+<a:ListOfPoints>((-127224,73349),(-139058,73349),(-139058,80867),(-152707,80867))</a:ListOfPoints>
 <a:CornerStyle>2</a:CornerStyle>
 <a:ArrowStyle>1</a:ArrowStyle>
 <a:LineColor>4194432</a:LineColor>
@@ -5254,7 +5254,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:CreationDate>1701660880</a:CreationDate>
 <a:ModificationDate>1703661889</a:ModificationDate>
 <a:IconMode>-1</a:IconMode>
-<a:Rect>((-133571,60388), (-120877,86311))</a:Rect>
+<a:Rect>((-133571,59901), (-120877,86798))</a:Rect>
 <a:LineColor>16512</a:LineColor>
 <a:FillColor>16570034</a:FillColor>
 <a:ShadowColor>12632256</a:ShadowColor>
@@ -8917,7 +8917,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Code>pc_site_user</a:Code>
 <a:CreationDate>1701660880</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
-<a:ModificationDate>1713834291</a:ModificationDate>
+<a:ModificationDate>1713834576</a:ModificationDate>
 <a:Modifier>bowin_89</a:Modifier>
 <a:TotalSavingCurrency/>
 <c:Columns>
@@ -9191,9 +9191,20 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(200)</a:DataType>
 <a:Length>200</a:Length>
 </o:Column>
+<o:Column Id="o415">
+<a:ObjectID>FF1E8C9C-1FED-4433-9032-B010B1E08342</a:ObjectID>
+<a:Name>现住址</a:Name>
+<a:Code>Address</a:Code>
+<a:CreationDate>1713834547</a:CreationDate>
+<a:Creator>bowin_89</a:Creator>
+<a:ModificationDate>1713834576</a:ModificationDate>
+<a:Modifier>bowin_89</a:Modifier>
+<a:DataType>varchar(200)</a:DataType>
+<a:Length>200</a:Length>
+</o:Column>
 </c:Columns>
 <c:Keys>
-<o:Key Id="o415">
+<o:Key Id="o416">
 <a:ObjectID>1F5C4356-EFB3-4E3C-98D8-E729B67196A8</a:ObjectID>
 <a:Name>Key_1</a:Name>
 <a:Code>Key_1</a:Code>
@@ -9207,7 +9218,7 @@ LABL 0 Arial,8,N</a:FontList>
 </o:Key>
 </c:Keys>
 <c:PrimaryKey>
-<o:Key Ref="o415"/>
+<o:Key Ref="o416"/>
 </c:PrimaryKey>
 </o:Table>
 <o:Table Id="o89">
@@ -9220,7 +9231,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Modifier>bowinuser</a:Modifier>
 <a:TotalSavingCurrency/>
 <c:Columns>
-<o:Column Id="o416">
+<o:Column Id="o417">
 <a:ObjectID>C80E5F93-194F-49DF-9DF6-BC747FF152E0</a:ObjectID>
 <a:Name>编码</a:Name>
 <a:Code>code</a:Code>
@@ -9231,7 +9242,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(18)</a:DataType>
 <a:Length>18</a:Length>
 </o:Column>
-<o:Column Id="o417">
+<o:Column Id="o418">
 <a:ObjectID>C47BD2A2-6AC7-4B2A-919D-F9645665FD36</a:ObjectID>
 <a:Name>名称</a:Name>
 <a:Code>name</a:Code>
@@ -9242,7 +9253,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(100)</a:DataType>
 <a:Length>100</a:Length>
 </o:Column>
-<o:Column Id="o418">
+<o:Column Id="o419">
 <a:ObjectID>1E5B5253-BA46-4E05-B5E2-8DA057293636</a:ObjectID>
 <a:Name>父级编码</a:Name>
 <a:Code>fid</a:Code>
@@ -9253,7 +9264,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(18)</a:DataType>
 <a:Length>18</a:Length>
 </o:Column>
-<o:Column Id="o419">
+<o:Column Id="o420">
 <a:ObjectID>6BD14B97-705C-476F-BFC7-F6F9F213DA43</a:ObjectID>
 <a:Name>全称</a:Name>
 <a:Code>fullname</a:Code>
@@ -9264,7 +9275,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(1000)</a:DataType>
 <a:Length>1000</a:Length>
 </o:Column>
-<o:Column Id="o420">
+<o:Column Id="o421">
 <a:ObjectID>5FDBB250-1BD2-466D-8DBA-2CDA5DC52523</a:ObjectID>
 <a:Name>级别</a:Name>
 <a:Code>lv</a:Code>
@@ -9287,7 +9298,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Modifier>bowinuser</a:Modifier>
 <a:TotalSavingCurrency/>
 <c:Columns>
-<o:Column Id="o421">
+<o:Column Id="o422">
 <a:ObjectID>0A4729AB-5CEA-45D4-A385-DA9E0E91B589</a:ObjectID>
 <a:Name>求职岗位ID</a:Name>
 <a:Code>ProfessionID</a:Code>
@@ -9299,7 +9310,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Length>50</a:Length>
 <a:Column.Mandatory>1</a:Column.Mandatory>
 </o:Column>
-<o:Column Id="o422">
+<o:Column Id="o423">
 <a:ObjectID>692A7050-890E-4B71-929B-E7358583F565</a:ObjectID>
 <a:Name>父级ID</a:Name>
 <a:Code>ParentProfessionID</a:Code>
@@ -9310,7 +9321,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(50)</a:DataType>
 <a:Length>50</a:Length>
 </o:Column>
-<o:Column Id="o423">
+<o:Column Id="o424">
 <a:ObjectID>B2751E64-1214-4B5A-8B30-DA00A7187DA2</a:ObjectID>
 <a:Name>求职岗位名称</a:Name>
 <a:Code>ProfeesionName</a:Code>
@@ -9321,7 +9332,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(20)</a:DataType>
 <a:Length>20</a:Length>
 </o:Column>
-<o:Column Id="o424">
+<o:Column Id="o425">
 <a:ObjectID>6123E68E-EAD1-471C-A363-6337107E329F</a:ObjectID>
 <a:Name>排列顺序</a:Name>
 <a:Code>OrderNo</a:Code>
@@ -9331,7 +9342,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Modifier>bowinuser</a:Modifier>
 <a:DataType>int</a:DataType>
 </o:Column>
-<o:Column Id="o425">
+<o:Column Id="o426">
 <a:ObjectID>F31F0732-903C-46A3-AF43-8490293F2688</a:ObjectID>
 <a:Name>状态</a:Name>
 <a:Code>Status</a:Code>
@@ -9343,7 +9354,7 @@ LABL 0 Arial,8,N</a:FontList>
 </o:Column>
 </c:Columns>
 <c:Keys>
-<o:Key Id="o426">
+<o:Key Id="o427">
 <a:ObjectID>3276AAF8-292A-4E7C-B134-86D43B6AC789</a:ObjectID>
 <a:Name>Key_1</a:Name>
 <a:Code>Key_1</a:Code>
@@ -9352,12 +9363,12 @@ LABL 0 Arial,8,N</a:FontList>
 <a:ModificationDate>1713147124</a:ModificationDate>
 <a:Modifier>bowinuser</a:Modifier>
 <c:Key.Columns>
-<o:Column Ref="o421"/>
+<o:Column Ref="o422"/>
 </c:Key.Columns>
 </o:Key>
 </c:Keys>
 <c:PrimaryKey>
-<o:Key Ref="o426"/>
+<o:Key Ref="o427"/>
 </c:PrimaryKey>
 </o:Table>
 <o:Table Id="o92">
@@ -9370,7 +9381,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Modifier>bowin90</a:Modifier>
 <a:TotalSavingCurrency/>
 <c:Columns>
-<o:Column Id="o427">
+<o:Column Id="o428">
 <a:ObjectID>EF6526C0-2FEE-42BB-B990-DFF9864B4345</a:ObjectID>
 <a:Name>唯一ID</a:Name>
 <a:Code>messageStatusId</a:Code>
@@ -9383,7 +9394,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Length>50</a:Length>
 <a:Column.Mandatory>1</a:Column.Mandatory>
 </o:Column>
-<o:Column Id="o428">
+<o:Column Id="o429">
 <a:ObjectID>4B3530E1-1442-4CD4-B3C8-ECB19BB6F2DB</a:ObjectID>
 <a:Name>微信openId</a:Name>
 <a:Code>openId</a:Code>
@@ -9395,7 +9406,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(300)</a:DataType>
 <a:Length>300</a:Length>
 </o:Column>
-<o:Column Id="o429">
+<o:Column Id="o430">
 <a:ObjectID>859BDCF2-E3E7-4113-AA65-7FF0F26DD2C3</a:ObjectID>
 <a:Name>业务ID</a:Name>
 <a:Code>sourceId</a:Code>
@@ -9407,7 +9418,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(50)</a:DataType>
 <a:Length>50</a:Length>
 </o:Column>
-<o:Column Id="o430">
+<o:Column Id="o431">
 <a:ObjectID>F21E97C2-B057-4156-BB9B-DD9059270B12</a:ObjectID>
 <a:Name>推送内容</a:Name>
 <a:Code>content</a:Code>
@@ -9418,7 +9429,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Comment>推送内容</a:Comment>
 <a:DataType>text</a:DataType>
 </o:Column>
-<o:Column Id="o431">
+<o:Column Id="o432">
 <a:ObjectID>AC18E990-27B9-4F67-A16C-23925A51DCFA</a:ObjectID>
 <a:Name>url</a:Name>
 <a:Code>url</a:Code>
@@ -9429,7 +9440,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(1000)</a:DataType>
 <a:Length>1000</a:Length>
 </o:Column>
-<o:Column Id="o432">
+<o:Column Id="o433">
 <a:ObjectID>C2AE553A-6601-4B06-B346-50EE169BE412</a:ObjectID>
 <a:Name>推送时间</a:Name>
 <a:Code>sendTime</a:Code>
@@ -9440,7 +9451,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Comment>推送时间</a:Comment>
 <a:DataType>datetime</a:DataType>
 </o:Column>
-<o:Column Id="o433">
+<o:Column Id="o434">
 <a:ObjectID>16E88D0D-B4B6-43B2-A16E-7C2A64E17A25</a:ObjectID>
 <a:Name>状态</a:Name>
 <a:Code>recordStatus</a:Code>
@@ -9451,7 +9462,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Comment>状态,0未推送,1已推送</a:Comment>
 <a:DataType>int</a:DataType>
 </o:Column>
-<o:Column Id="o434">
+<o:Column Id="o435">
 <a:ObjectID>73ED08AC-7B97-4372-A56C-EDC66E8CC4AB</a:ObjectID>
 <a:Name>创建人</a:Name>
 <a:Code>createUserID</a:Code>
@@ -9463,7 +9474,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(50)</a:DataType>
 <a:Length>50</a:Length>
 </o:Column>
-<o:Column Id="o435">
+<o:Column Id="o436">
 <a:ObjectID>771B6440-956C-41CF-A3C9-F67876E4936A</a:ObjectID>
 <a:Name>创建时间</a:Name>
 <a:Code>createTime</a:Code>
@@ -9474,7 +9485,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Comment>创建时间</a:Comment>
 <a:DataType>datetime</a:DataType>
 </o:Column>
-<o:Column Id="o436">
+<o:Column Id="o437">
 <a:ObjectID>3A8D896F-2710-4FB6-8FC6-3D7DAA2E2B47</a:ObjectID>
 <a:Name>修改人</a:Name>
 <a:Code>modifyUserID</a:Code>
@@ -9486,7 +9497,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(50)</a:DataType>
 <a:Length>50</a:Length>
 </o:Column>
-<o:Column Id="o437">
+<o:Column Id="o438">
 <a:ObjectID>7C39DC5E-DB29-459A-A803-CF3EAABD4143</a:ObjectID>
 <a:Name>修改时间</a:Name>
 <a:Code>modifyTime</a:Code>
@@ -9499,7 +9510,7 @@ LABL 0 Arial,8,N</a:FontList>
 </o:Column>
 </c:Columns>
 <c:Keys>
-<o:Key Id="o438">
+<o:Key Id="o439">
 <a:ObjectID>B8FCFC4F-8EE5-4A53-91B0-10071641EE3C</a:ObjectID>
 <a:Name>Key_1</a:Name>
 <a:Code>Key_1</a:Code>
@@ -9508,12 +9519,12 @@ LABL 0 Arial,8,N</a:FontList>
 <a:ModificationDate>1713437121</a:ModificationDate>
 <a:Modifier>bowin90</a:Modifier>
 <c:Key.Columns>
-<o:Column Ref="o427"/>
+<o:Column Ref="o428"/>
 </c:Key.Columns>
 </o:Key>
 </c:Keys>
 <c:PrimaryKey>
-<o:Key Ref="o438"/>
+<o:Key Ref="o439"/>
 </c:PrimaryKey>
 </o:Table>
 <o:Table Id="o93">
@@ -9526,7 +9537,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Modifier>bowin90</a:Modifier>
 <a:TotalSavingCurrency/>
 <c:Columns>
-<o:Column Id="o439">
+<o:Column Id="o440">
 <a:ObjectID>C7465F14-9DE1-4590-B922-6BA638A38A3D</a:ObjectID>
 <a:Name>微信消息模板编码</a:Name>
 <a:Code>templateNo</a:Code>
@@ -9539,7 +9550,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Length>10</a:Length>
 <a:Column.Mandatory>1</a:Column.Mandatory>
 </o:Column>
-<o:Column Id="o440">
+<o:Column Id="o441">
 <a:ObjectID>9454C1FA-0CE3-4BA4-9448-E005B1D204B0</a:ObjectID>
 <a:Name>微信消息模板名称</a:Name>
 <a:Code>templateName</a:Code>
@@ -9551,7 +9562,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(50)</a:DataType>
 <a:Length>50</a:Length>
 </o:Column>
-<o:Column Id="o441">
+<o:Column Id="o442">
 <a:ObjectID>907393F7-CDCA-42B7-AA04-B541C0EE497B</a:ObjectID>
 <a:Name>微信消息模板ID</a:Name>
 <a:Code>templateId</a:Code>
@@ -9563,7 +9574,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:DataType>varchar(300)</a:DataType>
 <a:Length>300</a:Length>
 </o:Column>
-<o:Column Id="o442">
+<o:Column Id="o443">
 <a:ObjectID>8600CCC7-2960-4703-9562-AE96E2CF3F97</a:ObjectID>
 <a:Name>模板跳转url</a:Name>
 <a:Code>url</a:Code>
@@ -9577,7 +9588,7 @@ LABL 0 Arial,8,N</a:FontList>
 </o:Column>
 </c:Columns>
 <c:Keys>
-<o:Key Id="o443">
+<o:Key Id="o444">
 <a:ObjectID>F1B3FF1D-0B67-4C0A-860E-BB3EFCFBCA1F</a:ObjectID>
 <a:Name>Key_1</a:Name>
 <a:Code>Key_1</a:Code>
@@ -9586,12 +9597,12 @@ LABL 0 Arial,8,N</a:FontList>
 <a:ModificationDate>1713441468</a:ModificationDate>
 <a:Modifier>bowin90</a:Modifier>
 <c:Key.Columns>
-<o:Column Ref="o439"/>
+<o:Column Ref="o440"/>
 </c:Key.Columns>
 </o:Key>
 </c:Keys>
 <c:PrimaryKey>
-<o:Key Ref="o443"/>
+<o:Key Ref="o444"/>
 </c:PrimaryKey>
 </o:Table>
 <o:Table Id="o94">
@@ -9604,7 +9615,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Modifier>bowin90</a:Modifier>
 <a:TotalSavingCurrency/>
 <c:Columns>
-<o:Column Id="o444">
+<o:Column Id="o445">
 <a:ObjectID>F5E9C7FD-BC70-4A21-B07D-072CDA88A141</a:ObjectID>
 <a:Name>微信消息模板编码</a:Name>
 <a:Code>templateNo</a:Code>
@@ -9617,7 +9628,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Length>10</a:Length>
 <a:Column.Mandatory>1</a:Column.Mandatory>
 </o:Column>
-<o:Column Id="o445">
+<o:Column Id="o446">
 <a:ObjectID>C1D08037-2874-40A3-BCF2-FF8CE3920A41</a:ObjectID>
 <a:Name>wxFieldName</a:Name>
 <a:Code>wxFieldName</a:Code>
@@ -9630,7 +9641,7 @@ LABL 0 Arial,8,N</a:FontList>
 <a:Length>30</a:Length>
 <a:Column.Mandatory>1</a:Column.Mandatory>
 </o:Column>
-<o:Column Id="o446">
+<o:Column Id="o447">
 <a:ObjectID>8CC02B30-DA95-4D69-8223-4F4DDCAA310E</a:ObjectID>
 <a:Name>sysFieldName</a:Name>
 <a:Code>sysFieldName</a:Code>
@@ -9644,7 +9655,7 @@ LABL 0 Arial,8,N</a:FontList>
 </o:Column>
 </c:Columns>
 <c:Keys>
-<o:Key Id="o447">
+<o:Key Id="o448">
 <a:ObjectID>A9ECA0F3-2901-45AB-9B65-AEB7A716B0BA</a:ObjectID>
 <a:Name>Key_1</a:Name>
 <a:Code>Key_1</a:Code>
@@ -9653,13 +9664,13 @@ LABL 0 Arial,8,N</a:FontList>
 <a:ModificationDate>1713443103</a:ModificationDate>
 <a:Modifier>bowin90</a:Modifier>
 <c:Key.Columns>
-<o:Column Ref="o444"/>
 <o:Column Ref="o445"/>
+<o:Column Ref="o446"/>
 </c:Key.Columns>
 </o:Key>
 </c:Keys>
 <c:PrimaryKey>
-<o:Key Ref="o447"/>
+<o:Key Ref="o448"/>
 </c:PrimaryKey>
 </o:Table>
 </c:Tables>
@@ -9685,7 +9696,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o127"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o448">
+<o:ReferenceJoin Id="o449">
 <a:ObjectID>54F04187-9C05-49AC-A2AE-0F6805B87FA6</a:ObjectID>
 <a:CreationDate>1700727651</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -9721,7 +9732,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o112"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o449">
+<o:ReferenceJoin Id="o450">
 <a:ObjectID>1C1F4C11-0B3A-4093-A82E-6A9FD4FD25D0</a:ObjectID>
 <a:CreationDate>1700727797</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -9757,7 +9768,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o112"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o450">
+<o:ReferenceJoin Id="o451">
 <a:ObjectID>40A0CA90-8614-4815-97AD-0EBD6F0B71D9</a:ObjectID>
 <a:CreationDate>1700730987</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -9793,7 +9804,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o112"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o451">
+<o:ReferenceJoin Id="o452">
 <a:ObjectID>FB4FAA07-CE83-4FCA-A8D0-3EAF2B4D6E07</a:ObjectID>
 <a:CreationDate>1700731007</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -9829,7 +9840,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o163"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o452">
+<o:ReferenceJoin Id="o453">
 <a:ObjectID>D517805A-E4C7-4403-8465-67312BEA0D62</a:ObjectID>
 <a:CreationDate>1700731026</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -9865,7 +9876,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o270"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o453">
+<o:ReferenceJoin Id="o454">
 <a:ObjectID>7A61F341-556C-4479-A342-A7646603F9F3</a:ObjectID>
 <a:CreationDate>1700731151</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -9901,7 +9912,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o221"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o454">
+<o:ReferenceJoin Id="o455">
 <a:ObjectID>690001A1-24C5-4BB0-860C-27E191E15580</a:ObjectID>
 <a:CreationDate>1700731191</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -9937,7 +9948,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o112"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o455">
+<o:ReferenceJoin Id="o456">
 <a:ObjectID>0B8B962D-B921-4C57-9B91-8C15F33BED75</a:ObjectID>
 <a:CreationDate>1700731590</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -9973,7 +9984,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o270"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o456">
+<o:ReferenceJoin Id="o457">
 <a:ObjectID>CF00EFE5-091D-4B44-9BC6-78E0E41801E0</a:ObjectID>
 <a:CreationDate>1700731650</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -10009,7 +10020,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o270"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o457">
+<o:ReferenceJoin Id="o458">
 <a:ObjectID>451F9C5E-5174-4834-8447-8BFBF152415E</a:ObjectID>
 <a:CreationDate>1700731691</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -10045,7 +10056,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o270"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o458">
+<o:ReferenceJoin Id="o459">
 <a:ObjectID>348ADE0B-66DB-4664-989D-92DEC0AF1BCD</a:ObjectID>
 <a:CreationDate>1700731736</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -10081,7 +10092,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o221"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o459">
+<o:ReferenceJoin Id="o460">
 <a:ObjectID>ABE69D56-EB12-409A-94E0-7250DB96B800</a:ObjectID>
 <a:CreationDate>1700731802</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -10117,7 +10128,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o270"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o460">
+<o:ReferenceJoin Id="o461">
 <a:ObjectID>08EDE705-0BB1-4605-9A44-22080589321A</a:ObjectID>
 <a:CreationDate>1700731807</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -10153,7 +10164,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o357"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o461">
+<o:ReferenceJoin Id="o462">
 <a:ObjectID>9948DA1B-7F6D-4BFD-944D-78B0BB942C79</a:ObjectID>
 <a:CreationDate>1701227667</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -10189,7 +10200,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o188"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o462">
+<o:ReferenceJoin Id="o463">
 <a:ObjectID>B70423BB-9802-457F-AE23-4CBF7D842F4E</a:ObjectID>
 <a:CreationDate>1701660221</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -10222,7 +10233,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Table Ref="o86"/>
 </c:ChildTable>
 <c:Joins>
-<o:ReferenceJoin Id="o463">
+<o:ReferenceJoin Id="o464">
 <a:ObjectID>5E4AB2FC-A524-45F4-9FE1-E46F2AFC9564</a:ObjectID>
 <a:CreationDate>1701661219</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -10258,7 +10269,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o112"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o464">
+<o:ReferenceJoin Id="o465">
 <a:ObjectID>3629C8A8-9FDA-42D0-825C-8B0997759790</a:ObjectID>
 <a:CreationDate>1701934197</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -10294,7 +10305,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o383"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o465">
+<o:ReferenceJoin Id="o466">
 <a:ObjectID>2374EDD3-256A-4744-B800-C1EAC2B3A8BA</a:ObjectID>
 <a:CreationDate>1703661458</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -10327,10 +10338,10 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Table Ref="o74"/>
 </c:ChildTable>
 <c:ParentKey>
-<o:Key Ref="o415"/>
+<o:Key Ref="o416"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o466">
+<o:ReferenceJoin Id="o467">
 <a:ObjectID>E869B4C1-58EF-4215-B2EE-702BC081782A</a:ObjectID>
 <a:CreationDate>1703661902</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -10366,7 +10377,7 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Key Ref="o221"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o467">
+<o:ReferenceJoin Id="o468">
 <a:ObjectID>9CCCDB43-37CB-4FEC-9728-5E1C604B931C</a:ObjectID>
 <a:CreationDate>1703727031</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
@@ -10399,17 +10410,17 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Table Ref="o81"/>
 </c:ChildTable>
 <c:ParentKey>
-<o:Key Ref="o426"/>
+<o:Key Ref="o427"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o468">
+<o:ReferenceJoin Id="o469">
 <a:ObjectID>69BDF72C-5720-4C82-887C-A74DF7E2A01D</a:ObjectID>
 <a:CreationDate>1713147069</a:CreationDate>
 <a:Creator>bowinuser</a:Creator>
 <a:ModificationDate>1713147124</a:ModificationDate>
 <a:Modifier>bowinuser</a:Modifier>
 <c:Object1>
-<o:Column Ref="o421"/>
+<o:Column Ref="o422"/>
 </c:Object1>
 <c:Object2>
 <o:Column Ref="o301"/>
@@ -10435,27 +10446,27 @@ LABL 0 Arial,8,N</a:FontList>
 <o:Table Ref="o94"/>
 </c:ChildTable>
 <c:ParentKey>
-<o:Key Ref="o443"/>
+<o:Key Ref="o444"/>
 </c:ParentKey>
 <c:Joins>
-<o:ReferenceJoin Id="o469">
+<o:ReferenceJoin Id="o470">
 <a:ObjectID>EA16D89A-A814-4871-B1D9-CCB394F38D05</a:ObjectID>
 <a:CreationDate>1713443051</a:CreationDate>
 <a:Creator>bowin90</a:Creator>
 <a:ModificationDate>1713443051</a:ModificationDate>
 <a:Modifier>bowin90</a:Modifier>
 <c:Object1>
-<o:Column Ref="o439"/>
+<o:Column Ref="o440"/>
 </c:Object1>
 <c:Object2>
-<o:Column Ref="o444"/>
+<o:Column Ref="o445"/>
 </c:Object2>
 </o:ReferenceJoin>
 </c:Joins>
 </o:Reference>
 </c:References>
 <c:DefaultGroups>
-<o:Group Id="o470">
+<o:Group Id="o471">
 <a:ObjectID>9EC8D640-B68B-4B22-9ECC-8604531BD893</a:ObjectID>
 <a:Name>PUBLIC</a:Name>
 <a:Code>PUBLIC</a:Code>
@@ -10466,7 +10477,7 @@ LABL 0 Arial,8,N</a:FontList>
 </o:Group>
 </c:DefaultGroups>
 <c:TargetModels>
-<o:TargetModel Id="o471">
+<o:TargetModel Id="o472">
 <a:ObjectID>F5495246-0AD0-47FB-87F5-4932E41412CF</a:ObjectID>
 <a:Name>MySQL 5.0</a:Name>
 <a:Code>MYSQL50</a:Code>

File diff suppressed because it is too large
+ 486 - 403
doc/就业驿站管理系统.pdm


+ 43 - 0
h5app/package-lock.json

@@ -23,6 +23,7 @@
         "ion-multi-picker": "^2.1.3",
         "ionicons": "^6.0.3",
         "pinia": "~2.0.18",
+        "v-viewer": "^3.0.13",
         "vue": "^3.2.47",
         "vue-baidu-map-3x": "^1.0.31",
         "vue-qrcode-reader": "^5.5.3",
@@ -11380,6 +11381,11 @@
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
       "dev": true
     },
+    "node_modules/lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+    },
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
@@ -15182,6 +15188,18 @@
         "uuid": "dist/bin/uuid"
       }
     },
+    "node_modules/v-viewer": {
+      "version": "3.0.13",
+      "resolved": "https://registry.npmmirror.com/v-viewer/-/v-viewer-3.0.13.tgz",
+      "integrity": "sha512-T8pgGzlF0ZCHVpD/32OKsD8MlpI6tqYP3n1XLcSjvGQMc0ABn8nJ4AumxvzAKVQrLRWtDTG6qRGAyCPCmi7ceA==",
+      "dependencies": {
+        "lodash-es": "^4.17.21"
+      },
+      "peerDependencies": {
+        "viewerjs": "^1.11.0",
+        "vue": "^3.0.0"
+      }
+    },
     "node_modules/v8-to-istanbul": {
       "version": "8.1.1",
       "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
@@ -15233,6 +15251,12 @@
         "extsprintf": "^1.2.0"
       }
     },
+    "node_modules/viewerjs": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/viewerjs/-/viewerjs-1.11.6.tgz",
+      "integrity": "sha512-TlhdSp2oEOLFXvEp4psKaeTjR5zBjTRcM/sHUN8PkV1UWuY8HKC8n7GaVdW5Xqnwdr/F1OmzLik1QwDjI4w/nw==",
+      "peer": true
+    },
     "node_modules/vue": {
       "version": "3.2.47",
       "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==",
@@ -25031,6 +25055,11 @@
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
       "dev": true
     },
+    "lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+    },
     "lodash.debounce": {
       "version": "4.0.8",
       "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
@@ -27915,6 +27944,14 @@
       "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
       "dev": true
     },
+    "v-viewer": {
+      "version": "3.0.13",
+      "resolved": "https://registry.npmmirror.com/v-viewer/-/v-viewer-3.0.13.tgz",
+      "integrity": "sha512-T8pgGzlF0ZCHVpD/32OKsD8MlpI6tqYP3n1XLcSjvGQMc0ABn8nJ4AumxvzAKVQrLRWtDTG6qRGAyCPCmi7ceA==",
+      "requires": {
+        "lodash-es": "^4.17.21"
+      }
+    },
     "v8-to-istanbul": {
       "version": "8.1.1",
       "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
@@ -27956,6 +27993,12 @@
         "extsprintf": "^1.2.0"
       }
     },
+    "viewerjs": {
+      "version": "1.11.6",
+      "resolved": "https://registry.npmmirror.com/viewerjs/-/viewerjs-1.11.6.tgz",
+      "integrity": "sha512-TlhdSp2oEOLFXvEp4psKaeTjR5zBjTRcM/sHUN8PkV1UWuY8HKC8n7GaVdW5Xqnwdr/F1OmzLik1QwDjI4w/nw==",
+      "peer": true
+    },
     "vue": {
       "version": "3.2.47",
       "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==",

+ 1 - 0
h5app/package.json

@@ -26,6 +26,7 @@
     "ion-multi-picker": "^2.1.3",
     "ionicons": "^6.0.3",
     "pinia": "~2.0.18",
+    "v-viewer": "^3.0.13",
     "vue": "^3.2.47",
     "vue-baidu-map-3x": "^1.0.31",
     "vue-qrcode-reader": "^5.5.3",

+ 14 - 0
h5app/src/api/system/file.ts

@@ -35,6 +35,7 @@ export function uploadBase64(data: any) {
         },
         {
             isNew: true,
+            errorMsg: '上次失败!'
         },
     );
 }
@@ -61,3 +62,16 @@ export function downloadPdm(url: any) {
     })
 }
 
+export function getFileBase64(fileId: string) {
+    return request<object>(
+        {
+            url: 'system/file/getFileBase64',
+            method: 'get',
+            params: {fileId:fileId},
+        },
+        {
+            isNew: true,
+        },
+    );
+}
+

+ 214 - 0
h5app/src/components/bImage.vue

@@ -0,0 +1,214 @@
+<template>
+  <div class="img-list" v-viewer>
+    <div class="img-item" v-for="(it,key) in imageList" :key="key">
+      <div v-if="it.blobUrl">
+        <img :src="it.blobUrl"/>
+        <ion-icon v-if="!readonly" :icon="closeCircleOutline" color="danger" class="remove-icon"
+                  @click="deleteFile(it)"></ion-icon>
+      </div>
+    </div>
+    <div class="img-item" v-if="(!isSingle || imageList.length==0) && !readonly">
+      <ion-button color="light" @click="takePicture()">
+        <ion-icon :icon="addOutline" size="large"></ion-icon>
+      </ion-button>
+    </div>
+    <ion-item v-if="readonly && imageList.length==0">
+      <ion-label style="flex: 0 0 100% !important;"><p>暂无</p></ion-label>
+    </ion-item>
+  </div>
+</template>
+<script lang="ts">
+import {defineComponent, ref} from "vue";
+import {camera, cameraOutline, addOutline, closeCircleOutline} from "ionicons/icons";
+import {alertController, IonIcon, IonThumbnail, loadingController} from '@ionic/vue';
+import {Camera, CameraResultType, CameraSource} from '@capacitor/camera';
+import {deleteFile as deleteFileApi, getFileBase64, getList, uploadBase64} from '@/api/system/file';
+import {presentAlert} from "@/api/common";
+import {dealImage, base64ToBlob} from "@/utils/imageUtils";
+
+export default defineComponent({
+      name: 'b-image',
+      components: {IonIcon},
+      props: {
+        fileRefId: {type: String, default: ''},
+        fileType: {type: Number, default: 1},
+        readonly: {type: Boolean, default: true},
+        isSingle: {type: Boolean, default: false} //只能上次一张图片
+      },
+      setup(props) {
+        const accept = 'png,jpeg,jpg,gif';
+        const imageList = ref<any>([]);
+
+        const getImageList = () => {
+          imageList.value = [];
+          if (props.fileRefId)
+            getList({fileRefID: props.fileRefId}).then(resultList => {
+              imageList.value = resultList as any;
+              imageList.value.forEach((img: any) => {
+                if (!img.base64) {
+                  getFileBase64(img.fileId).then(base64Str => {
+                    if (base64Str)
+                      img.blobUrl = URL.createObjectURL(base64ToBlob("data:image/png;base64," + base64Str));
+                  });
+                }
+              });
+            });
+        };
+
+        const takePicture = async () => {
+          if (props.fileRefId === '' || props.fileRefId == null) {
+            await presentAlert("参数fileRefId为空");
+            return false;
+          }
+
+          const image = await Camera.getPhoto({
+            quality: 90,
+            allowEditing: true,
+            source: CameraSource.Photos,
+            resultType: CameraResultType.Uri,
+          });
+
+          if (!accept?.split(',').includes(image.format)) {
+            await presentAlert("只能上传格式为:" + accept + "的文件");
+            return null;
+          }
+
+          dealImage(image.webPath as string, 1000, saveFile);
+        };
+
+        const saveFile = async (newBase64: string) => {
+          const formData = new FormData();
+          formData.append('base64Str', newBase64 as any);
+          formData.append("fileRefId", props.fileRefId);
+          formData.append("fileType", props.fileType.toString());
+          formData.append("isSingle", props.isSingle ? "1" : "0");
+
+          const loading = await loadingController.create({
+            cssClass: 'my-custom-class',
+            message: '正在上传,请稍等...',
+            duration: 2000,
+          });
+
+          await loading.present();
+
+          uploadBase64(formData).then((result) => {
+            if (result) {
+              presentAlert("上传成功");
+              /*getImageList();*/
+              getList({fileRefID: props.fileRefId}).then(resultList => {
+                const imgList = resultList as any;
+                imgList.forEach((img: any) => {
+                  if (imageList.value.filter((it: any) => it.fileId === img.fileId).length == 0) {
+                    getFileBase64(img.fileId).then(base64Str => {
+                      if (base64Str) {
+                        img.blobUrl = URL.createObjectURL(base64ToBlob("data:image/png;base64," + base64Str));
+                        imageList.value.push(img);
+                      }
+
+                    });
+                  }
+                });
+              });
+            }
+          })
+        };
+
+        const deleteFile = async (item: any) => {
+          const alert = await alertController.create({
+            header: '提示!',
+            message: '是否确认删除?',
+            buttons: [
+              {
+                text: '取消',
+                role: 'cancel'
+              },
+              {
+                text: '确认删除',
+                handler: async () => {
+                  const loading = await loadingController.create({
+                    cssClass: 'my-custom-class',
+                    message: '正在删除,请稍等...',
+                    duration: 2000,
+                  });
+
+                  await loading.present();
+
+                  deleteFileApi({fileId: item.fileId}).then(result => {
+                    if (result) {
+                      imageList.value = imageList.value.filter((it: any) => it.fileId != item.fileId);
+                    }
+                  });
+                }
+              }
+            ],
+          });
+
+          await alert.present();
+        }
+
+        getImageList();
+
+        return {
+          camera,
+          IonThumbnail,
+          takePicture,
+          imageList,
+          deleteFile,
+          addOutline,
+          closeCircleOutline
+        }
+      }
+    }
+);
+</script>
+<style lang="less">
+.img-list {
+  display: flex;
+  text-align: center;
+  flex-direction: row;
+  flex-wrap: wrap;
+  padding: 5px 10px;
+
+  .img-item {
+    width: 25%;
+    position: relative;
+    padding: 0 5px;
+
+    img {
+      height: 73px;
+      object-fit: cover;
+      border-radius: 10px;
+      width: 100%;
+    }
+
+    .remove-icon {
+      position: absolute;
+      right: -3px;
+      top: -6px;
+      font-size: 20px;
+    }
+
+    ion-button {
+      --box-shadow: 0px;
+      height: 73px;
+      width: 75px;
+    }
+  }
+}
+
+.showbigimg {
+  z-index: 10;
+  width: 100%;
+  height: 100%;
+  background: #e1e1e1;
+  display: flex;
+  justify-content: center; /*在主轴上的对齐*/
+  align-items: center; /*在交叉轴上中心点的对齐*/
+
+  img {
+    opacity: 1;
+    vertical-align: middle;
+  }
+}
+
+</style>

+ 4 - 0
h5app/src/main.ts

@@ -27,10 +27,14 @@ import '@ionic/vue/css/display.css';
 /* Theme variables */
 import './theme/variables.css';
 
+import Viewer from "v-viewer";
+import 'viewerjs/dist/viewer.css'
+
 const app = createApp(App);
 app.config.globalProperties.$routeActive=false; //退出登录清除缓存
 app.use(IonicVue)
 app.use(router);
+app.use(Viewer);
 
 setupStore(app);
 

+ 29 - 13
h5app/src/utils/imageUtils.ts

@@ -2,7 +2,7 @@
  * @param {file}
  * @returns {string} 转Base64文件
  */
-export function getBase64(file:any) {
+export function getBase64(file: any) {
     return new Promise((resolve, reject) => {
         ///FileReader类就是专门⽤来读⽂件的
         const reader = new FileReader();
@@ -15,34 +15,35 @@ export function getBase64(file:any) {
         reader.onerror = (error) => reject(error);
     });
 }
+
 /**
  * @param {base64url}
  * @returns {string} // 获取文件得大小
  */
-export function calSize(base64url:string) {
+export function calSize(base64url: string) {
     let str = base64url.replace('data:image/png;base64,', '');
     const equalIndex = str.indexOf('=');
-    if(str.indexOf('=') > 0) {
+    if (str.indexOf('=') > 0) {
         str = str.substring(0, equalIndex);
     }
     const strLength = str.length;
     const fileLength = strLength - (strLength / 8) * 2;
     // 返回单位为MB的大小
-    return  parseFloat((fileLength / (1024 * 1024)).toFixed(2));
+    return parseFloat((fileLength / (1024 * 1024)).toFixed(2));
 }
 
 /**
  * @param {path,w,callback}
  * @returns {callback} // 通过canvas压缩base64图片 并压缩
  */
-export function dealImage(path:string, w=1000, callback:any){
+export function dealImage(path: string, w = 1000, callback: any) {
     const newImage = new Image();
-    const size=calSize(path);//获取mb大小
+    const size = calSize(path);//获取mb大小
     let quality = 0.52
-    if(size<=1){//1 mb
-        quality=0.9;
+    if (size <= 1) {//1 mb
+        quality = 0.9;
     }
-    if(size>1){
+    if (size > 1) {
         quality = 0.8
     }
 
@@ -50,7 +51,7 @@ export function dealImage(path:string, w=1000, callback:any){
     newImage.setAttribute("crossOrigin", 'Anonymous');    // url为外域时需要
     let imgWidth;
     let imgHeight;
-    newImage.onload = function() {
+    newImage.onload = function () {
         imgWidth = newImage.width;
         imgHeight = newImage.height;
         const canvas = document.createElement("canvas");
@@ -83,13 +84,28 @@ export function dealImage(path:string, w=1000, callback:any){
  * @method calSize 获取图片大小
  */
 const other = {
-    base64: (file:any) => {
+    base64: (file: any) => {
         return getBase64(file)
     },
-    getDealImage:(path:any, w:number, callback:any)=>{
+    getDealImage: (path: any, w: number, callback: any) => {
         return dealImage(path, w, callback)
     },
-    getCalSize:(url:string)=>{
+    getCalSize: (url: string) => {
         return calSize(url)
     }
+}
+
+export function base64ToBlob(data: string) {
+    const arr = data.split(',');
+    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+    // @ts-ignore
+    const mime = arr[0].match(/:(.*?);/)[1];
+    const bstr = atob(arr[1]);
+    let n = bstr.length;
+    const u8arr = new Uint8Array(n);
+
+    while (n--) {
+        u8arr[n] = bstr.charCodeAt(n);
+    }
+    return new Blob([u8arr], {type: mime});
 }

+ 104 - 96
h5app/src/views/pages/demo/edit.vue

@@ -1,110 +1,118 @@
 <template>
-   <ion-page class="list-page">
-     <ion-header>
-       <ion-toolbar>
-         <ion-title>表单页面</ion-title>
-       </ion-toolbar>
-     </ion-header>
-     <ion-content>
-       <div class="bw-vue-form">
-         <div class="form-title">船舶信息编辑页面</div>
-         <div class="form-input">
-           <ion-label>船舶名称</ion-label>
-           <ion-input placeholder="请输入船舶名称"></ion-input>
-         </div>
-         <div class="form-input">
-           <ion-label>证件号码</ion-label>
-           <ion-input placeholder="请输入证件号码"></ion-input>
-         </div>
-         <div class="form-select">
-           <ion-label>船舶主体</ion-label>
-           <ion-select interface="action-sheet" placeholder="请选择船舶主体">
-             <ion-select-option value="apples">Apples</ion-select-option>
-             <ion-select-option value="oranges">Oranges</ion-select-option>
-             <ion-select-option value="bananas">Bananas</ion-select-option>
-           </ion-select>
-         </div>
-       </div>
+  <ion-page class="list-page">
+    <ion-header>
+      <ion-toolbar>
+        <ion-title>表单页面</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <div class="bw-vue-form">
+        <div class="form-title">船舶信息编辑页面</div>
+        <div class="form-input">
+          <ion-label>船舶名称</ion-label>
+          <ion-input placeholder="请输入船舶名称"></ion-input>
+        </div>
+        <div class="form-input">
+          <ion-label>证件号码</ion-label>
+          <ion-input placeholder="请输入证件号码"></ion-input>
+        </div>
+        <div class="form-select">
+          <ion-label>船舶主体</ion-label>
+          <ion-select interface="action-sheet" placeholder="请选择船舶主体">
+            <ion-select-option value="apples">Apples</ion-select-option>
+            <ion-select-option value="oranges">Oranges</ion-select-option>
+            <ion-select-option value="bananas">Bananas</ion-select-option>
+          </ion-select>
+        </div>
+      </div>
 
-       <div class="bw-vue-form">
-         <div class="form-title">个人基本信息详情页面</div>
-         <div class="form-detail">
-           <ion-label>社保号码</ion-label>
-           <ion-text>123456789</ion-text>
-         </div>
-         <div class="form-detail">
-           <ion-label>姓名</ion-label>
-           <ion-text>张xx</ion-text>
-         </div>
-         <div class="form-detail">
-           <ion-label>性别</ion-label>
-           <ion-text>男</ion-text>
-         </div>
-         <div class="form-detail">
-           <ion-label>民族</ion-label>
-           <ion-text>汉族</ion-text>
-         </div>
-         <div class="form-detail">
-           <ion-label>联系电话</ion-label>
-           <ion-text>123456789</ion-text>
-         </div>
-         <div class="form-detail">
-           <ion-label>简单介绍</ion-label>
-           <ion-text>上海张江综合性国家科学中心与合肥综合性国家科学中心携手实施“两心同创”,探路科技创新共同体建设。“合肥光源”和“上海光源”的合作,正是这一探索的生动实践</ion-text>
-         </div>
-       </div>
+      <div class="bw-vue-form">
+        <div class="form-title">个人基本信息详情页面</div>
+        <div class="form-detail">
+          <ion-label>社保号码</ion-label>
+          <ion-text>123456789</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>姓名</ion-label>
+          <ion-text>张xx</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>性别</ion-label>
+          <ion-text>男</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>民族</ion-label>
+          <ion-text>汉族</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>联系电话</ion-label>
+          <ion-text>123456789</ion-text>
+        </div>
+        <div class="form-detail">
+          <ion-label>简单介绍</ion-label>
+          <ion-text>
+            上海张江综合性国家科学中心与合肥综合性国家科学中心携手实施“两心同创”,探路科技创新共同体建设。“合肥光源”和“上海光源”的合作,正是这一探索的生动实践
+          </ion-text>
+        </div>
+      </div>
 
-       <div class="bw-vue-list">
-         <div class="list-title">列表页面</div>
-         <div class="list-content">
-           <ion-list>
-             <ion-item>
-               <ion-label>
-                 <div class="multi-title">
-                   <h2>广州市中医院同德门诊部</h2>
-                   <p>7.58km</p>
-                 </div>
-                 <p>广州市白云区27号</p>
-               </ion-label>
-             </ion-item>
-             <ion-item>
-               <ion-label>
-                 <h2>H3 Heading</h2>
-                 <p>Paragraph</p>
-               </ion-label>
-             </ion-item>
-             <ion-item>
-               <ion-label>
-                 <h2>H3 Heading</h2>
-                 <p>Paragraph</p>
-               </ion-label>
-             </ion-item>
-             <ion-item>
-               <ion-label>
-                 <h2>H3 Heading</h2>
-                 <p>Paragraph</p>
-               </ion-label>
-             </ion-item>
-           </ion-list>
-         </div>
-       </div>
-<!--       <div>
-         <b-qr-scan></b-qr-scan>
-       </div>-->
-     </ion-content>
+      <div class="bw-vue-list">
+        <div class="list-title">列表页面</div>
+        <div class="list-content">
+          <ion-list>
+            <ion-item>
+              <ion-label>
+                <div class="multi-title">
+                  <h2>广州市中医院同德门诊部</h2>
+                  <p>7.58km</p>
+                </div>
+                <p>广州市白云区27号</p>
+              </ion-label>
+            </ion-item>
+            <ion-item>
+              <ion-label>
+                <h2>H3 Heading</h2>
+                <p>Paragraph</p>
+              </ion-label>
+            </ion-item>
+            <ion-item>
+              <ion-label>
+                <h2>H3 Heading</h2>
+                <p>Paragraph</p>
+              </ion-label>
+            </ion-item>
+            <ion-item>
+              <ion-label>
+                <h2>H3 Heading</h2>
+                <p>Paragraph</p>
+              </ion-label>
+            </ion-item>
+          </ion-list>
+        </div>
+      </div>
+      <!--       <div>
+               <b-qr-scan></b-qr-scan>
+             </div>-->
 
-   </ion-page>
+      <b-image :file-ref-id="fileRefId" :readonly="false" :is-single="false"></b-image>
+    </ion-content>
+
+  </ion-page>
 </template>
 <script>
 import {defineComponent} from "vue";
 import BQrScan from "@/components/bQrScan.vue";
+import BImage from "@/components/bImage.vue";
 
 export default defineComponent({
-  name:"demo_edit",
+  name: "demo_edit",
   // eslint-disable-next-line vue/no-unused-components
-  components:{BQrScan},
-  setup(){
-    return {}
+  components: {BQrScan, BImage},
+  setup() {
+    const fileRefId = "11111";//文件关键业务ID
+    return {
+      fileRefId
+    }
   }
 });
 </script>

+ 6 - 1
src/main/java/com/hz/employmentsite/controller/baseSettings/SiteUserController.java

@@ -7,6 +7,7 @@ import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.model.SelectProps;
 import com.hz.employmentsite.services.service.AccountService;
 import com.hz.employmentsite.services.service.baseSettings.SiteUserService;
+import com.hz.employmentsite.util.DateUtils;
 import com.hz.employmentsite.util.ExcelHelper;
 import com.hz.employmentsite.vo.baseSettings.SiteUserVo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,6 +32,9 @@ public class SiteUserController {
     @Autowired
     private ExcelHelper excelHelper;
 
+    @Autowired
+    private DateUtils dateUtils;
+
     @ResponseBody
     @GetMapping("/getList")
     public BaseResponse<PageInfo<SiteUserVo>> getList(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize,
@@ -80,7 +84,7 @@ public class SiteUserController {
                                @RequestParam(required = false) String siteID) throws Exception{
         PageInfo<SiteUserVo> result = userInfoService.getList(pageIndex, pageSize, siteUserIDList, siteUserName, siteID, null, null, null);
         ExcelHelper.ExcelData data = excelHelper.new ExcelData();
-        data.setTitles(Arrays.asList(new String[]{"序号", "工号", "人员名称", "角色", "性别", "联系电话", "身份证号", "所属驿站"}));
+        data.setTitles(Arrays.asList(new String[]{"序号", "工号", "人员名称", "角色", "性别", "联系电话", "年龄", "身份证号", "所属驿站"}));
         int i = 0;
         List<List<Object>> rowsData= new ArrayList();
         for (SiteUserVo item : result.getList()) {
@@ -92,6 +96,7 @@ public class SiteUserController {
             row.add(item.roleName);
             row.add(item.genderName);
             row.add(item.mobile);
+            row.add(dateUtils.getAgeForIdCard(item.getIdCard()));
             row.add(item.idCard);
             row.add(item.siteName);
             rowsData.add(row);

+ 1 - 0
src/main/java/com/hz/employmentsite/mapper/PcSiteUserMapper.java

@@ -27,6 +27,7 @@ public interface PcSiteUserMapper {
 
     List<String> selectByIdCard(@Param("idCard") String idCard);
 
+    List<String> selectBySocialSecurityCard(@Param("socialSecurityCard") String socialSecurityCard);
 
     int updateByExampleSelective(@Param("row") PcSiteUser row, @Param("example") PcSiteUserExample example);
 

+ 130 - 0
src/main/java/com/hz/employmentsite/model/PcSiteUser.java

@@ -29,6 +29,32 @@ public class PcSiteUser {
 
     private String IDCard;
 
+    private String SocialSecurityCard;
+
+    private Integer Age;
+
+    private String FinishSchool;
+
+    private String Profession;
+
+    private String NativePlace;
+
+    private String Email;
+
+    private String Address;
+
+    private Integer Nation;
+
+    private Integer PoliticsStatusID;
+
+    private Integer CultureRank;
+
+    private Integer IsFullTime;
+
+    private Integer OccupationalCategory;
+
+    private Integer OccupationalLevel;
+
     public String getSiteUserID() {
         return siteUserID;
     }
@@ -132,4 +158,108 @@ public class PcSiteUser {
     public void setIDCard(String IDCard) {
         this.IDCard = IDCard == null ? null : IDCard.trim();
     }
+
+    public String getSocialSecurityCard() {
+        return SocialSecurityCard;
+    }
+
+    public void setSocialSecurityCard(String socialSecurityCard) {
+        SocialSecurityCard = socialSecurityCard;
+    }
+
+    public Integer getAge() {
+        return Age;
+    }
+
+    public void setAge(Integer age) {
+        Age = age;
+    }
+
+    public Integer getNation() {
+        return Nation;
+    }
+
+    public void setNation(Integer nation) {
+        Nation = nation;
+    }
+
+    public Integer getPoliticsStatusID() {
+        return PoliticsStatusID;
+    }
+
+    public void setPoliticsStatusID(Integer politicsStatusID) {
+        PoliticsStatusID = politicsStatusID;
+    }
+
+    public Integer getCultureRank() {
+        return CultureRank;
+    }
+
+    public void setCultureRank(Integer cultureRank) {
+        CultureRank = cultureRank;
+    }
+
+    public String getFinishSchool() {
+        return FinishSchool;
+    }
+
+    public void setFinishSchool(String finishSchool) {
+        FinishSchool = finishSchool;
+    }
+
+    public String getProfession() {
+        return Profession;
+    }
+
+    public void setProfession(String profession) {
+        Profession = profession;
+    }
+
+    public Integer getIsFullTime() {
+        return IsFullTime;
+    }
+
+    public void setIsFullTime(Integer isFullTime) {
+        IsFullTime = isFullTime;
+    }
+
+    public Integer getOccupationalCategory() {
+        return OccupationalCategory;
+    }
+
+    public void setOccupationalCategory(Integer occupationalCategory) {
+        OccupationalCategory = occupationalCategory;
+    }
+
+    public Integer getOccupationalLevel() {
+        return OccupationalLevel;
+    }
+
+    public void setOccupationalLevel(Integer occupationalLevel) {
+        OccupationalLevel = occupationalLevel;
+    }
+
+    public String getNativePlace() {
+        return NativePlace;
+    }
+
+    public void setNativePlace(String nativePlace) {
+        NativePlace = nativePlace;
+    }
+
+    public String getEmail() {
+        return Email;
+    }
+
+    public void setEmail(String email) {
+        Email = email;
+    }
+
+    public String getAddress() {
+        return Address;
+    }
+
+    public void setAddress(String address) {
+        Address = address;
+    }
 }

+ 42 - 1
src/main/java/com/hz/employmentsite/services/impl/baseSettings/SiteUserImpl.java

@@ -103,10 +103,14 @@ public class SiteUserImpl implements SiteUserService {
     public Integer save(SiteUserVo data, String userId) {
         int result = 0;
 
-        // 手机号查重
+        // 重要信息查重
         List<String> byMobileSiteId = pcSiteUserMapper.selectByMobile(data.mobile);
         List<String> byUserNoSiteId = pcSiteUserMapper.selectByUserNo(data.userNo);
         List<String> byIdCardSiteId = pcSiteUserMapper.selectByIdCard(data.idCard);
+        List<String> bySocialSecurityCard = new ArrayList<>();
+        if (!data.getSocialSecurityCard().isEmpty() && !data.getSocialSecurityCard().isBlank()) {
+            bySocialSecurityCard = pcSiteUserMapper.selectBySocialSecurityCard(data.socialSecurityCard);
+        }
 
         SiteUserVo record = get(data.siteUserID);
         PcSiteUser dbData = record == null ? null : pcSiteUserMapper.selectByPrimaryKey(record.siteUserID);
@@ -126,6 +130,12 @@ public class SiteUserImpl implements SiteUserService {
             if (!byIdCardSiteId.isEmpty()) {
                 throw new BaseException("500", "该身份证已绑定其他驿站人员");
             }
+            // 社保卡非必填
+            if (!data.getSocialSecurityCard().isEmpty() && !data.getSocialSecurityCard().isBlank()) {
+                if (!bySocialSecurityCard.isEmpty()) {
+                    throw new BaseException("500", "该社保卡已绑定其他驿站人员");
+                }
+            }
 
             //添加
             //处理用户表
@@ -152,6 +162,19 @@ public class SiteUserImpl implements SiteUserService {
             dbData.setMobile(data.getMobile());
             dbData.setUserNo(data.getUserNo());
             dbData.setIDCard(data.getIdCard());
+            dbData.setSocialSecurityCard(data.getSocialSecurityCard());
+            dbData.setFinishSchool(data.getFinishSchool());
+            dbData.setProfession(data.getProfession());
+            dbData.setNativePlace(data.getNativePlace());
+            dbData.setEmail(data.getEmail());
+            dbData.setAddress(data.getAddress());
+            dbData.setNation(data.getNation());
+            dbData.setPoliticsStatusID(data.getPoliticsStatusID());
+            dbData.setCultureRank(data.getCultureRank());
+            dbData.setIsFullTime(data.getIsFullTime());
+            dbData.setOccupationalCategory(data.getOccupationalCategory());
+            dbData.setOccupationalLevel(data.getOccupationalLevel());
+
             dbData.setCreateUserID(userId);
             dbData.setCreateTime(new Date());
             result += pcSiteUserMapper.insert(dbData);
@@ -166,6 +189,12 @@ public class SiteUserImpl implements SiteUserService {
             if (!byIdCardSiteId.isEmpty() && !byIdCardSiteId.contains(data.siteUserID)) {
                 throw new BaseException("500", "该身份证已绑定其他驿站人员");
             }
+            // 社保卡非必填
+            if (!data.getSocialSecurityCard().isEmpty() && !data.getSocialSecurityCard().isBlank()) {
+                if (!bySocialSecurityCard.isEmpty() && !bySocialSecurityCard.contains(data.siteUserID)) {
+                    throw new BaseException("500", "该社保卡已绑定其他驿站人员");
+                }
+            }
 
             //修改
             //处理用户表
@@ -189,6 +218,18 @@ public class SiteUserImpl implements SiteUserService {
             dbData.setMobile(data.mobile);
             dbData.setUserNo(data.userNo);
             dbData.setIDCard(data.idCard);
+            dbData.setSocialSecurityCard(data.socialSecurityCard);
+            dbData.setFinishSchool(data.finishSchool);
+            dbData.setProfession(data.profession);
+            dbData.setNativePlace(data.nativePlace);
+            dbData.setEmail(data.email);
+            dbData.setAddress(data.address);
+            dbData.setNation(data.nation);
+            dbData.setPoliticsStatusID(data.politicsStatusID);
+            dbData.setCultureRank(data.cultureRank);
+            dbData.setIsFullTime(data.isFullTime);
+            dbData.setOccupationalCategory(data.occupationalCategory);
+            dbData.setOccupationalLevel(data.occupationalLevel);
             dbData.setUpdateBy(userId);
             dbData.setUpdateTime(new Date());
             result += pcSiteUserMapper.updateByPrimaryKey(dbData);

+ 21 - 0
src/main/java/com/hz/employmentsite/vo/baseSettings/SiteUserVo.java

@@ -25,6 +25,27 @@ public class SiteUserVo {
     public String userNo;
     public String idCard;
 
+    public String socialSecurityCard;
+    public Integer age;
+    public String finishSchool;
+    public String profession;
+    public String nativePlace;
+    public String email;
+    public String address;
+
+    public Integer nation;
+    public String nationName;
+    public Integer politicsStatusID;
+    public String politicsStatusName;
+    public Integer cultureRank;
+    public String cultureRankName;
+    public Integer isFullTime;
+    public String isFullTimeName;
+    public Integer occupationalCategory;
+    public String occupationalCategoryName;
+    public Integer occupationalLevel;
+    public String occupationalLevelName;
+
     public String userID;
     //注意:roleID已用于绑定用户表sys_user中用户类型字典,非角色类型数据
     public Integer roleID;

+ 230 - 34
src/main/resources/mapping/PcSiteUserMapper.xml

@@ -109,16 +109,24 @@
     </if>
   </delete>
   <insert id="insert" parameterType="com.hz.employmentsite.model.PcSiteUser">
-    insert into pc_site_user (SiteUserID, SiteUserName, UserID, 
-      SiteID, Gender, Mobile, 
-      RoleID, CreateUserID, CreateTime, 
-      UpdateBy, UpdateTime, UserNo, 
-      IDCard)
-    values (#{siteUserID,jdbcType=VARCHAR}, #{siteUserName,jdbcType=VARCHAR}, #{userID,jdbcType=VARCHAR}, 
-      #{siteID,jdbcType=VARCHAR}, #{gender,jdbcType=INTEGER}, #{mobile,jdbcType=VARCHAR}, 
-      #{roleID,jdbcType=INTEGER}, #{createUserID,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, 
-      #{updateBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP}, #{userNo,jdbcType=VARCHAR}, 
-      #{IDCard,jdbcType=VARCHAR})
+    insert into pc_site_user (SiteUserID, SiteUserName, UserID,
+                              SiteID, Gender, Mobile,
+                              RoleID, CreateUserID, CreateTime,
+                              UpdateBy, UpdateTime, UserNo,
+                              IDCard, SocialSecurityCard, Age,
+                              Nation, PoliticsStatusID, CultureRank,
+                              FinishSchool, Profession, IsFullTime,
+                              OccupationalCategory, OccupationalLevel, NativePlace,
+                              Email, Address)
+    values (#{siteUserID,jdbcType=VARCHAR}, #{siteUserName,jdbcType=VARCHAR}, #{userID,jdbcType=VARCHAR},
+            #{siteID,jdbcType=VARCHAR}, #{gender,jdbcType=INTEGER}, #{mobile,jdbcType=VARCHAR},
+            #{roleID,jdbcType=INTEGER}, #{createUserID,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},
+            #{updateBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP}, #{userNo,jdbcType=VARCHAR},
+            #{IDCard,jdbcType=VARCHAR}, #{SocialSecurityCard,jdbcType=VARCHAR}, #{Age,jdbcType=INTEGER},
+            #{Nation,jdbcType=INTEGER}, #{PoliticsStatusID,jdbcType=INTEGER}, #{CultureRank,jdbcType=INTEGER},
+            #{FinishSchool,jdbcType=VARCHAR}, #{Profession,jdbcType=VARCHAR}, #{IsFullTime,jdbcType=INTEGER},
+            #{OccupationalCategory,jdbcType=INTEGER}, #{OccupationalLevel,jdbcType=INTEGER},
+            #{NativePlace,jdbcType=VARCHAR}, #{Email,jdbcType=VARCHAR}, #{Address,jdbcType=VARCHAR})
   </insert>
   <insert id="insertSelective" parameterType="com.hz.employmentsite.model.PcSiteUser">
     insert into pc_site_user
@@ -162,6 +170,45 @@
       <if test="IDCard != null">
         IDCard,
       </if>
+      <if test="SocialSecurityCard != null">
+        SocialSecurityCard,
+      </if>
+      <if test="Age != null">
+        Age,
+      </if>
+      <if test="Nation != null">
+        Nation,
+      </if>
+      <if test="PoliticsStatusID != null">
+        PoliticsStatusID,
+      </if>
+      <if test="CultureRank != null">
+        CultureRank,
+      </if>
+      <if test="FinishSchool != null">
+        FinishSchool,
+      </if>
+      <if test="Profession != null">
+        Profession,
+      </if>
+      <if test="IsFullTime != null">
+        IsFullTime,
+      </if>
+      <if test="OccupationalCategory != null">
+        OccupationalCategory,
+      </if>
+      <if test="OccupationalLevel != null">
+        OccupationalLevel,
+      </if>
+      <if test="NativePlace != null">
+        NativePlace,
+      </if>
+      <if test="Email != null">
+        Email,
+      </if>
+      <if test="Address != null">
+        Address,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="siteUserID != null">
@@ -203,6 +250,45 @@
       <if test="IDCard != null">
         #{IDCard,jdbcType=VARCHAR},
       </if>
+      <if test="SocialSecurityCard != null">
+        #{SocialSecurityCard,jdbcType=VARCHAR},
+      </if>
+      <if test="Age != null">
+        #{Age,jdbcType=INTEGER},
+      </if>
+      <if test="Nation != null">
+        #{Nation,jdbcType=INTEGER},
+      </if>
+      <if test="PoliticsStatusID != null">
+        #{PoliticsStatusID,jdbcType=INTEGER},
+      </if>
+      <if test="CultureRank != null">
+        #{CultureRank,jdbcType=INTEGER},
+      </if>
+      <if test="FinishSchool != null">
+        #{FinishSchool,jdbcType=VARCHAR},
+      </if>
+      <if test="Profession != null">
+        #{Profession,jdbcType=VARCHAR},
+      </if>
+      <if test="IsFullTime != null">
+        #{IsFullTime,jdbcType=INTEGER},
+      </if>
+      <if test="OccupationalCategory != null">
+        #{OccupationalCategory,jdbcType=INTEGER},
+      </if>
+      <if test="OccupationalLevel != null">
+        #{OccupationalLevel,jdbcType=INTEGER},
+      </if>
+      <if test="NativePlace != null">
+        #{NativePlace,jdbcType=VARCHAR},
+      </if>
+      <if test="Email != null">
+        #{Email,jdbcType=VARCHAR},
+      </if>
+      <if test="Address != null">
+        #{Address,jdbcType=VARCHAR},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.hz.employmentsite.model.PcSiteUserExample" resultType="java.lang.Long">
@@ -253,6 +339,45 @@
       <if test="row.IDCard != null">
         IDCard = #{row.IDCard,jdbcType=VARCHAR},
       </if>
+      <if test="row.SocialSecurityCard != null">
+        SocialSecurityCard = #{row.SocialSecurityCard,jdbcType=VARCHAR},
+      </if>
+      <if test="row.Age != null">
+        Age = #{row.Age,jdbcType=INTEGER},
+      </if>
+      <if test="row.Nation != null">
+        Nation = #{row.Nation,jdbcType=INTEGER},
+      </if>
+      <if test="row.PoliticsStatusID != null">
+        PoliticsStatusID = #{row.PoliticsStatusID,jdbcType=INTEGER},
+      </if>
+      <if test="row.CultureRank != null">
+        CultureRank = #{row.CultureRank,jdbcType=INTEGER},
+      </if>
+      <if test="row.FinishSchool != null">
+        FinishSchool = #{row.FinishSchool,jdbcType=VARCHAR},
+      </if>
+      <if test="row.Profession != null">
+        Profession = #{row.Profession,jdbcType=VARCHAR},
+      </if>
+      <if test="row.IsFullTime != null">
+        IsFullTime = #{row.IsFullTime,jdbcType=INTEGER},
+      </if>
+      <if test="row.OccupationalCategory != null">
+        OccupationalCategory = #{row.OccupationalCategory,jdbcType=INTEGER},
+      </if>
+      <if test="row.OccupationalLevel != null">
+        OccupationalLevel = #{row.OccupationalLevel,jdbcType=INTEGER},
+      </if>
+      <if test="row.NativePlace != null">
+        NativePlace = #{row.NativePlace,jdbcType=VARCHAR},
+      </if>
+      <if test="row.Email != null">
+        Email = #{row.Email,jdbcType=VARCHAR},
+      </if>
+      <if test="row.Address != null">
+        Address = #{row.Address,jdbcType=VARCHAR},
+      </if>
     </set>
     <if test="example != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -261,18 +386,31 @@
   <update id="updateByExample" parameterType="map">
     update pc_site_user
     set SiteUserID = #{row.siteUserID,jdbcType=VARCHAR},
-      SiteUserName = #{row.siteUserName,jdbcType=VARCHAR},
-      UserID = #{row.userID,jdbcType=VARCHAR},
-      SiteID = #{row.siteID,jdbcType=VARCHAR},
-      Gender = #{row.gender,jdbcType=INTEGER},
-      Mobile = #{row.mobile,jdbcType=VARCHAR},
-      RoleID = #{row.roleID,jdbcType=INTEGER},
-      CreateUserID = #{row.createUserID,jdbcType=VARCHAR},
-      CreateTime = #{row.createTime,jdbcType=TIMESTAMP},
-      UpdateBy = #{row.updateBy,jdbcType=VARCHAR},
-      UpdateTime = #{row.updateTime,jdbcType=TIMESTAMP},
-      UserNo = #{row.userNo,jdbcType=VARCHAR},
-      IDCard = #{row.IDCard,jdbcType=VARCHAR}
+    SiteUserName = #{row.siteUserName,jdbcType=VARCHAR},
+    UserID = #{row.userID,jdbcType=VARCHAR},
+    SiteID = #{row.siteID,jdbcType=VARCHAR},
+    Gender = #{row.gender,jdbcType=INTEGER},
+    Mobile = #{row.mobile,jdbcType=VARCHAR},
+    RoleID = #{row.roleID,jdbcType=INTEGER},
+    CreateUserID = #{row.createUserID,jdbcType=VARCHAR},
+    CreateTime = #{row.createTime,jdbcType=TIMESTAMP},
+    UpdateBy = #{row.updateBy,jdbcType=VARCHAR},
+    UpdateTime = #{row.updateTime,jdbcType=TIMESTAMP},
+    UserNo = #{row.userNo,jdbcType=VARCHAR},
+    IDCard = #{row.IDCard,jdbcType=VARCHAR},
+    SocialSecurityCard = #{row.SocialSecurityCard,jdbcType=VARCHAR},
+    Age = #{row.Age,jdbcType=INTEGER},
+    Nation = #{row.Nation,jdbcType=INTEGER},
+    PoliticsStatusID = #{row.PoliticsStatusID,jdbcType=INTEGER},
+    CultureRank = #{row.CultureRank,jdbcType=INTEGER},
+    FinishSchool = #{row.FinishSchool,jdbcType=VARCHAR},
+    Profession = #{row.Profession,jdbcType=VARCHAR},
+    IsFullTime = #{row.IsFullTime,jdbcType=VARCHAR},
+    OccupationalCategory = #{row.OccupationalCategory,jdbcType=INTEGER},
+    OccupationalLevel = #{row.OccupationalLevel,jdbcType=INTEGER},
+    NativePlace = #{row.NativePlace,jdbcType=VARCHAR},
+    Email = #{row.Email,jdbcType=VARCHAR},
+    Address = #{row.Address,jdbcType=VARCHAR}
     <if test="example != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
@@ -316,23 +454,75 @@
       <if test="IDCard != null">
         IDCard = #{IDCard,jdbcType=VARCHAR},
       </if>
+      <if test="row.SocialSecurityCard != null">
+        SocialSecurityCard = #{row.SocialSecurityCard,jdbcType=VARCHAR},
+      </if>
+      <if test="row.Age != null">
+        Age = #{row.Age,jdbcType=INTEGER},
+      </if>
+      <if test="row.Nation != null">
+        Nation = #{row.Nation,jdbcType=INTEGER},
+      </if>
+      <if test="row.PoliticsStatusID != null">
+        PoliticsStatusID = #{row.PoliticsStatusID,jdbcType=INTEGER},
+      </if>
+      <if test="row.CultureRank != null">
+        CultureRank = #{row.CultureRank,jdbcType=INTEGER},
+      </if>
+      <if test="row.FinishSchool != null">
+        FinishSchool = #{row.FinishSchool,jdbcType=VARCHAR},
+      </if>
+      <if test="row.Profession != null">
+        Profession = #{row.Profession,jdbcType=VARCHAR},
+      </if>
+      <if test="row.IsFullTime != null">
+        IsFullTime = #{row.IsFullTime,jdbcType=INTEGER},
+      </if>
+      <if test="row.OccupationalCategory != null">
+        OccupationalCategory = #{row.OccupationalCategory,jdbcType=INTEGER},
+      </if>
+      <if test="row.OccupationalLevel != null">
+        OccupationalLevel = #{row.OccupationalLevel,jdbcType=INTEGER},
+      </if>
+      <if test="row.NativePlace != null">
+        NativePlace = #{row.NativePlace,jdbcType=VARCHAR},
+      </if>
+      <if test="row.Email != null">
+        Email = #{row.Email,jdbcType=VARCHAR},
+      </if>
+      <if test="row.Address != null">
+        Address = #{row.Address,jdbcType=VARCHAR},
+      </if>
     </set>
     where SiteUserID = #{siteUserID,jdbcType=VARCHAR}
   </update>
   <update id="updateByPrimaryKey" parameterType="com.hz.employmentsite.model.PcSiteUser">
     update pc_site_user
-    set SiteUserName = #{siteUserName,jdbcType=VARCHAR},
-        UserID       = #{userID,jdbcType=VARCHAR},
-        SiteID       = #{siteID,jdbcType=VARCHAR},
-        Gender       = #{gender,jdbcType=INTEGER},
-        Mobile       = #{mobile,jdbcType=VARCHAR},
-        RoleID       = #{roleID,jdbcType=INTEGER},
-        CreateUserID = #{createUserID,jdbcType=VARCHAR},
-        CreateTime   = #{createTime,jdbcType=TIMESTAMP},
-        UpdateBy     = #{updateBy,jdbcType=VARCHAR},
-        UpdateTime   = #{updateTime,jdbcType=TIMESTAMP},
-        UserNo       = #{userNo,jdbcType=VARCHAR},
-        IDCard       = #{IDCard,jdbcType=VARCHAR}
+    set SiteUserName         = #{siteUserName,jdbcType=VARCHAR},
+        UserID               = #{userID,jdbcType=VARCHAR},
+        SiteID               = #{siteID,jdbcType=VARCHAR},
+        Gender               = #{gender,jdbcType=INTEGER},
+        Mobile               = #{mobile,jdbcType=VARCHAR},
+        RoleID               = #{roleID,jdbcType=INTEGER},
+        CreateUserID         = #{createUserID,jdbcType=VARCHAR},
+        CreateTime           = #{createTime,jdbcType=TIMESTAMP},
+        UpdateBy             = #{updateBy,jdbcType=VARCHAR},
+        UpdateTime           = #{updateTime,jdbcType=TIMESTAMP},
+        UserNo               = #{userNo,jdbcType=VARCHAR},
+        IDCard               = #{IDCard,jdbcType=VARCHAR},
+        SocialSecurityCard   = #{SocialSecurityCard,jdbcType=VARCHAR},
+        Age                  = #{Age,jdbcType=INTEGER},
+        Nation               = #{Nation,jdbcType=INTEGER},
+        PoliticsStatusID     = #{PoliticsStatusID,jdbcType=INTEGER},
+        CultureRank          = #{CultureRank,jdbcType=INTEGER},
+        FinishSchool         = #{FinishSchool,jdbcType=VARCHAR},
+        Profession           = #{Profession,jdbcType=VARCHAR},
+        IsFullTime           = #{IsFullTime,jdbcType=VARCHAR},
+        OccupationalCategory = #{OccupationalCategory,jdbcType=INTEGER},
+        OccupationalLevel    = #{OccupationalLevel,jdbcType=INTEGER},
+        NativePlace          = #{NativePlace,jdbcType=VARCHAR},
+        Email                = #{Email,jdbcType=VARCHAR},
+        Address              = #{Address,jdbcType=VARCHAR}
     where SiteUserID = #{siteUserID,jdbcType=VARCHAR}
   </update>
 
@@ -353,4 +543,10 @@
     from pc_site_user
     where idCard = #{idCard,jdbcType=VARCHAR}
   </select>
+
+  <select id="selectBySocialSecurityCard" resultType="String">
+    select SiteUserID
+    from pc_site_user
+    where SocialSecurityCard = #{socialSecurityCard,jdbcType=VARCHAR}
+  </select>
 </mapper>

+ 27 - 3
src/main/resources/mapping/cquery/SiteUserCQuery.xml

@@ -3,11 +3,35 @@
 <mapper namespace="com.hz.employmentsite.mapper.cquery.UserInfoCQuery">
     <select id="getList" resultType="com.hz.employmentsite.vo.baseSettings.SiteUserVo">
         select siteUser.*,dic_userRole.Name as RoleName,dic_gender.Name as GenderName,site.SiteName
-        ,inSites.InstitutionID as institutionID,site.regionCode
+        ,inSites.InstitutionID as institutionID,site.regionCode, dic_fullTime.Name as isFullTimeName
+        ,dic_occ_cat.Name as occupationalCategoryName, dic_occ_level.Name as occupationalLevelName
+        ,dic_nation.Name as nationName, dic_politicsStatus.Name as politicsStatusName
+        ,dic_culture.Name as cultureRankName
         from pc_site_user siteUser
         left join pc_site site on siteUser.siteID = site.siteID
-        left join (select * from sys_dictionary_item where DictionaryCode ='UserType' ) dic_userRole  on siteUser.RoleID = dic_userRole.Value
-        left join (select * from sys_dictionary_item where DictionaryCode ='Gender' ) dic_gender  on siteUser.Gender = dic_gender.Value
+        left join (select * from sys_dictionary_item where DictionaryCode ='UserType' ) dic_userRole on siteUser.RoleID
+        = dic_userRole.Value
+        left join (select * from sys_dictionary_item where DictionaryCode ='Gender' ) dic_gender on siteUser.Gender =
+        dic_gender.Value
+        left join (select * from sys_dictionary_item where DictionaryCode ='IsFullTime' ) dic_fullTime on
+        siteUser.IsFullTime
+        =
+        dic_fullTime.Value
+        left join (select * from sys_dictionary_item where DictionaryCode ='OccupationalCategory' ) dic_occ_cat on
+        siteUser.OccupationalCategory =
+        dic_occ_cat.Value
+        left join (select * from sys_dictionary_item where DictionaryCode ='OccupationalLevel' ) dic_occ_level on
+        siteUser.OccupationalLevel =
+        dic_occ_level.Value
+        left join (select * from sys_dictionary_item where DictionaryCode ='NationType' ) dic_nation on
+        siteUser.Nation =
+        dic_nation.Value
+        left join (select * from sys_dictionary_item where DictionaryCode ='PoliticsStatus' ) dic_politicsStatus on
+        siteUser.PoliticsStatusID =
+        dic_politicsStatus.Value
+        left join (select * from sys_dictionary_item where DictionaryCode ='CultureLevel' ) dic_culture on
+        siteUser.CultureRank =
+        dic_culture.Value
         left join pc_site_institution inSites on site.SiteID = inSites.SiteID
         left join pc_institution institution on inSites.institutionID = institution.InstitutionID
         where 1=1

BIN
vue/src/assets/images/logo-login.png


+ 38 - 1
vue/src/views/baseSettings/siteUser/detail.vue

@@ -10,15 +10,34 @@
       <a-descriptions-item label="用户类型">{{ siteUserInfo.roleName }}</a-descriptions-item>
       <a-descriptions-item label="所属驿站">{{ siteUserInfo.siteName }}</a-descriptions-item>
     </a-descriptions>
+    <a-divider orientation="left">其他信息</a-divider>
+    <a-descriptions bordered>
+      <a-descriptions-item label="社保卡号">{{ siteUserInfo.socialSecurityCard }}</a-descriptions-item>
+      <a-descriptions-item label="民族">{{ siteUserInfo.nationName }}</a-descriptions-item>
+      <a-descriptions-item label="政治面貌">{{ siteUserInfo.politicsStatusName }}</a-descriptions-item>
+      <a-descriptions-item label="最高学历">{{ siteUserInfo.cultureRankName }}</a-descriptions-item>
+      <a-descriptions-item label="毕业院校">{{ siteUserInfo.finishSchool }}</a-descriptions-item>
+      <a-descriptions-item label="专业">{{ siteUserInfo.profession }}</a-descriptions-item>
+      <a-descriptions-item label="是否全日制">{{ siteUserInfo.isFullTimeName }}</a-descriptions-item>
+      <a-descriptions-item label="职业资格类别">{{ siteUserInfo.occupationalCategoryName }}</a-descriptions-item>
+      <a-descriptions-item label="职业资格等级">{{ siteUserInfo.occupationalLevelName }}</a-descriptions-item>
+      <a-descriptions-item label="籍贯">{{ siteUserInfo.nativePlace }}</a-descriptions-item>
+      <a-descriptions-item label="邮箱">{{ siteUserInfo.email }}</a-descriptions-item>
+      <a-descriptions-item label="住址">{{ siteUserInfo.address }}</a-descriptions-item>
+    </a-descriptions>
+    <a-divider orientation="left">相片</a-divider>
+    <b-upload-file :fileRefId="siteUserInfo.siteUserID" :readonly="true" :multiple="true"
+                   :setFileList="setFileList" :accept="'.pdf,.png,.jpg'"></b-upload-file>
   </div>
 </template>
 
 <script setup lang="ts">
-import {onMounted, reactive} from "vue";
+import {onMounted, reactive, ref} from "vue";
 import {getSiteUserByID} from "@/api/baseSettings/userInfo";
 
 // 站点人员信息
 const siteUserInfo = reactive({
+  siteUserID: "",
   siteUserName: "",
   genderName: "",
   mobile: "",
@@ -26,8 +45,26 @@ const siteUserInfo = reactive({
   idCard: "",
   roleName: "",
   siteName: "",
+  socialSecurityCard: "",
+  finishSchool: "",
+  profession: "",
+  nativePlace: "",
+  email: "",
+  address: "",
+  nationName: "",
+  politicsStatusName: "",
+  cultureRankName: "",
+  isFullTimeName: "",
+  occupationalCategoryName: "",
+  occupationalLevelName: "",
 })
 
+// 文件列表
+const fileList = ref();
+const setFileList = (files) => {
+  fileList.value = files;
+};
+
 // 站点人员数据加载
 function loadData(siteUserID: string) {
   getSiteUserByID(siteUserID).then((result: any) => {

+ 156 - 3
vue/src/views/baseSettings/siteUser/edit.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="card-edit">
     <a-form :model="dataModel" autocomplete="off" @finish="onFinish">
-      <a-divider orientation="left">站点人员管理</a-divider>
+      <a-divider orientation="left">站点人员基本信息</a-divider>
       <a-row type="flex">
         <a-col :span="7">
           <a-form-item label="姓名" name="siteUserName" :label-col="{span:7}" :rules="[{ required: true, message: '请输入人员姓名!' }]">
@@ -32,8 +32,8 @@
           </a-form-item>
         </a-col>
         <a-col :span="8">
-          <a-form-item label="身份证" name="idCard" :label-col="{span:7}"
-                       :rules="[{ required: true, message: '请输入身份证!' }]">
+          <a-form-item label="身份证" name="idCard" :label-col="{span:7}"
+                       :rules="[{ required: true, message: '请输入身份证!' }]">
             <label v-if="opCategory==3">{{ dataModel.idCard }}</label>
             <a-input v-model:value="dataModel.idCard" placeholder=""/>
           </a-form-item>
@@ -59,6 +59,96 @@
           </a-form-item>
         </a-col>
       </a-row>
+      <a-divider orientation="left">其他信息</a-divider>
+      <a-row type="flex">
+        <a-col :span="7">
+          <a-form-item label="社保卡号" name="socialSecurityCard" :label-col="{span:7}">
+            <label v-if="opCategory==3">{{ dataModel.socialSecurityCard }}</label>
+            <a-input v-model:value="dataModel.socialSecurityCard" placeholder=""/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="民族" name="nation" :label-col="{span:7}">
+            <label v-if="opCategory==3">{{ dataModel.nation }}</label>
+            <a-select ref="select" v-model:value="dataModel.nation" :options="nationList"
+                      :field-names="{ label: 'name', value: 'value' }" :allow-clear="false"></a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="政治面貌" name="cultureRank" :label-col="{span:7}">
+            <label v-if="opCategory==3">{{ dataModel.politicsStatusID }}</label>
+            <a-select ref="select" v-model:value="dataModel.politicsStatusID" :options="politicsStatusList"
+                      :field-names="{ label: 'name', value: 'value' }" :allow-clear="false"></a-select>
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row type="flex">
+        <a-col :span="7">
+          <a-form-item label="最高学历" name="cultureRank" :label-col="{span:7}">
+            <label v-if="opCategory==3">{{ dataModel.cultureRank }}</label>
+            <a-select ref="select" v-model:value="dataModel.cultureRank" :options="cultureRankList"
+                      :field-names="{ label: 'name', value: 'value' }" :allow-clear="false"></a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="毕业院校" name="finishSchool" :label-col="{span:7}">
+            <label v-if="opCategory==3">{{ dataModel.finishSchool }}</label>
+            <a-input v-model:value="dataModel.finishSchool" placeholder=""/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="专业" name="profession" :label-col="{span:7}">
+            <label v-if="opCategory==3">{{ dataModel.profession }}</label>
+            <a-input v-model:value="dataModel.profession" placeholder=""/>
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row type="flex">
+        <a-col :span="7">
+          <a-form-item label="是否全日制" name="isFullTime" :label-col="{span:7}">
+            <label v-if="opCategory==3">{{ dataModel.isFullTime }}</label>
+            <a-select ref="select" v-model:value="dataModel.isFullTime" :options="isFullTimeList"
+                      :field-names="{ label: 'name', value: 'value' }" :allow-clear="false"></a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="职业资格类别" name="occupationalCategory" :label-col="{span:7}">
+            <label v-if="opCategory==3">{{ dataModel.occupationalCategory }}</label>
+            <a-select ref="select" v-model:value="dataModel.occupationalCategory" :options="occupationalCategoryList"
+                      :field-names="{ label: 'name', value: 'value' }" :allow-clear="false"></a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="职业资格等级" name="occupationalLevel" :label-col="{span:7}">
+            <label v-if="opCategory==3">{{ dataModel.occupationalLevel }}</label>
+            <a-select ref="select" v-model:value="dataModel.occupationalLevel" :options="occupationalLevelList"
+                      :field-names="{ label: 'name', value: 'value' }" :allow-clear="false"></a-select>
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row type="flex">
+        <a-col :span="7">
+          <a-form-item label="籍贯" name="nativePlace" :label-col="{span:7}">
+            <label v-if="opCategory==3">{{ dataModel.nativePlace }}</label>
+            <a-input v-model:value="dataModel.nativePlace" placeholder=""/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="邮箱" name="email" :label-col="{span:7}">
+            <label v-if="opCategory==3">{{ dataModel.email }}</label>
+            <a-input v-model:value="dataModel.email" placeholder=""/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="住址" name="address" :label-col="{span:7}">
+            <label v-if="opCategory==3">{{ dataModel.address }}</label>
+            <a-input v-model:value="dataModel.address" placeholder=""/>
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-divider orientation="left">相片</a-divider>
+      <b-upload-file :fileRefId="dataModel.siteUserID" :readonly="false" :multiple="true"
+                     :setFileList="setFileList" :accept="'.pdf,.png,.jpg'" :disabled="opCategory==3"></b-upload-file>
       <a-form-item class="buttom-btns">
         <a-button @click="onClose">取消</a-button>
         <a-button type="primary" html-type="submit">提交</a-button>
@@ -102,7 +192,19 @@ export default defineComponent({
     });
     const allSites = ref<any>([]);
     const genderList = ref<SelectProps["options"]>();
+    const nationList = ref<SelectProps["options"]>();
     const roleList = ref<SelectProps["options"]>([]);
+    const politicsStatusList = ref<SelectProps["options"]>();
+    const cultureRankList = ref<SelectProps["options"]>();
+    const isFullTimeList = ref<SelectProps["options"]>();
+    const occupationalCategoryList = ref<SelectProps["options"]>();
+    const occupationalLevelList = ref<SelectProps["options"]>();
+
+
+    const fileList = ref();
+    const setFileList = (files) => {
+      fileList.value = files;
+    };
 
     const getAllSites = () => {
       getSiteList({pageIndex:1,pageSize:9999}).then((result :any) => {
@@ -118,10 +220,41 @@ export default defineComponent({
       roleList.value = operateType==1?[{name:"驿站工作者",value:3}]:roleResult;
       // console.log("roleList",roleList.value);
     }
+    const getNationList = async function () {
+      const nationResult: any = await getSysDictionaryList("NationType");
+      nationList.value = nationResult;
+    }
+    const getPoliticsStatusList = async function () {
+      const politicsStatusResult: any = await getSysDictionaryList("PoliticsStatus");
+      politicsStatusList.value = politicsStatusResult;
+    }
+    const getIsFullTimeList = async function () {
+      const result: any = await getSysDictionaryList("IsFullTime");
+      isFullTimeList.value = result;
+    }
+    const getOccupationalCategoryList = async function () {
+      const result: any = await getSysDictionaryList("OccupationalCategory");
+      occupationalCategoryList.value = result;
+    }
+    const getOccupationalLevelList = async function () {
+      const result: any = await getSysDictionaryList("OccupationalLevel");
+      occupationalLevelList.value = result;
+    }
+    const getCultureRankList = async function () {
+      const result: any = await getSysDictionaryList("CultureLevel");
+      cultureRankList.value = result;
+    }
+
 
     const loadData = (siteUserID: string,operateType:number) => {
       getAllSites();
       getGenderList();
+      getNationList()
+      getPoliticsStatusList()
+      getIsFullTimeList()
+      getOccupationalCategoryList()
+      getOccupationalLevelList()
+      getCultureRankList()
       getRoleList(operateType);
       opCategory.value = operateType;
       getSiteUserByID(siteUserID).then((result: any) => {
@@ -154,6 +287,18 @@ export default defineComponent({
       }
     }
 
+    function emailValidate() {
+      if (!formData.dataModel.email) {
+        return;
+      }
+      isAllowCommit.value = true;
+      let pattern = /\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/;
+      if (!pattern.test(formData.dataModel.email)) {
+        message.error("输入的邮箱格式有误!");
+        isAllowCommit.value = false;
+      }
+    }
+
     const onClose = (reload: any) => {
       tabsViewStore.closeCurrentTabByPath('/baseSettings/user/add');
       tabsViewStore.closeCurrentTabByPath('/baseSettings/user/edit');
@@ -163,6 +308,7 @@ export default defineComponent({
     const onFinish = () => {
       mobileValidate();
       idCardValidate();
+      emailValidate();
       if(isAllowCommit.value){
         saveSiteUser(formData.dataModel).then(result => {
           if (result) {
@@ -187,6 +333,13 @@ export default defineComponent({
       genderList,
       roleList,
       onSelectChange,
+      setFileList,
+      nationList,
+      politicsStatusList,
+      cultureRankList,
+      isFullTimeList,
+      occupationalCategoryList,
+      occupationalLevelList,
     };
   },
   created() {

+ 27 - 0
vue/src/views/baseSettings/siteUser/index.vue

@@ -110,6 +110,11 @@ export default defineComponent({
       {title: '用户类型', dataIndex: 'roleName', key: 'roleName',width:120, align: "center"},
       {title: '性别', dataIndex: 'genderName', key: 'genderName', align: "center"},
       {title: '联系电话', dataIndex: 'mobile', key: 'mobile', align: "center"},
+      {
+        title: '年龄', dataIndex: 'age', key: 'age', align: "center", customRender: item => {
+          return calculateAge(item.record.idCard);
+        }
+      },
       {title: '身份证号', dataIndex: 'idCard', key: 'idCard', align: "center"},
       {title: '所属驿站', dataIndex: 'siteName', key: 'siteName', align: "center"},
       {title: '操作', key: 'operation', fixed: 'right', width: 150, align: "center"},
@@ -140,6 +145,28 @@ export default defineComponent({
       showTotal: total => getPaginationTotalTitle(total)
     }));
 
+    const calculateAge = (idCardNumber) => {
+      if (!idCardNumber) {
+        return 0;
+      }
+
+      // 假设身份证号中出生日期的格式为YYYYMMDD
+      const birthYear = parseInt(idCardNumber.substring(6, 10), 10);
+      const birthMonth = parseInt(idCardNumber.substring(10, 12), 10);
+      const birthDay = parseInt(idCardNumber.substring(12, 14), 10);
+      // 获取当前日期
+      const currentDate = new Date();
+      const currentYear = currentDate.getFullYear();
+      const currentMonth = currentDate.getMonth() + 1; // 月份从 0 开始
+      const currentDay = currentDate.getDate();
+      // 计算年龄
+      let age = currentYear - birthYear;
+      if (currentMonth < birthMonth || (currentMonth === birthMonth && currentDay < birthDay)) {
+        age--; // 生日还未过,减去一岁
+      }
+      return age;
+    }
+
     const getAllSites = () => {
       getSiteList(searchParams).then((result :any) => {
         allSites.value = result.list;

+ 13 - 11
vue/src/views/jobUserManager/jobhunt/edit.vue

@@ -15,13 +15,13 @@
           </a-form-item>
         </a-col>
       <a-col :span="8">
-        <a-form-item label="人才类型"  name="jobUserType" :label-col="{span:7}" :rules="[{ required: true, message: '请选择人才类型!' }]">
-          <label v-if="opCategory==3">{{dataModel.jobUserType }}</label>
-          <a-select  ref="select"  v-model:value="dataModel.jobUserType" :options="jobUserTypeList"
-                     :field-names="{label:'name',value:'value'}"  :allow-clear="true"  >
-          </a-select>
+        <a-form-item label="求职岗位"  name="professionName" :label-col="{span:7}" :rules="[{ required: true,message:'请选择求职岗位!' }]">
+          <!-- <label v-if="opCategory==3">{{dataModel.postID}}</label> -->
+          <a-cascader :load-data="loadLevelProfessionList" v-model:value="dataModel.professionName"
+                      :options="firstProfessionList" change-on-select>
+          </a-cascader>
         </a-form-item>
-        </a-col>
+      </a-col>
         <a-col :span="9">
           <a-form-item label="月薪要求" name="salary" style="overflow: hidden;line-height: 35px;height: 35px;" :label-col="{span:7}">
             <label style="color:red;float: left;position:relative;right:80px;line-height: 35px;" >*</label>
@@ -51,13 +51,15 @@
           </a-form-item>
         </a-col>
         <a-col :span="9">
-          <a-form-item label="求职岗位"  name="professionName" :label-col="{span:7}" :rules="[{ required: true,message:'请选择求职岗位!' }]">
-            <!-- <label v-if="opCategory==3">{{dataModel.postID}}</label> -->
-            <a-cascader :load-data="loadLevelProfessionList" v-model:value="dataModel.professionName"
-                        :options="firstProfessionList" change-on-select>
-            </a-cascader>
+
+          <a-form-item label="人才类型"  name="jobUserType" :label-col="{span:7}" :rules="[{ required: true, message: '请选择人才类型!' }]">
+            <label v-if="opCategory==3">{{dataModel.jobUserType }}</label>
+            <a-select  ref="select"  v-model:value="dataModel.jobUserType" :options="jobUserTypeList"
+                       :field-names="{label:'name',value:'value'}"  :allow-clear="true"  >
+            </a-select>
           </a-form-item>
         </a-col>
+
       </a-row>
       <a-row type="flex">
         <a-col :span="7">